16. 模板方法模式(Template Method)

问题:多个流程有相同的骨架,只有个别步骤不同。

核心:父类定义算法骨架,子类实现具体步骤。

class DataParser {
  parse() {
    const raw = this.read();
    const data = this.process(raw);
    this.output(data);
  }
  read()   { throw new Error('子类必须实现 read'); }
  process(raw) { throw new Error('子类必须实现 process'); }
  output(data) { console.log(`结果: ${JSON.stringify(data)}`); }
}

class JSONParser extends DataParser {
  read()   { return '{"name":"小明","age":25}'; }
  process(raw) { return JSON.parse(raw); }
}

class CSVParser extends DataParser {
  read()   { return '小明,25'; }
  process(raw) {
    const [name, age] = raw.split(',');
    return { name, age: Number(age) };
  }
}

new JSONParser().parse(); // 结果: {"name":"小明","age":25}
new CSVParser().parse();  // 结果: {"name":"小明","age":25}
package template

import (
  "encoding/json"
  "fmt"
  "strings"
)

type DataParser interface {
  Read() string
  Process(raw string) any
}

func Parse(p DataParser) {
  raw := p.Read()
  data := p.Process(raw)
  fmt.Printf("结果: %v\n", data)
}

type JSONParser struct{}

func (j JSONParser) Read() string {
  return `{"name":"小明","age":25}`
}

func (j JSONParser) Process(raw string) any {
  var result map[string]any
  json.Unmarshal([]byte(raw), &result)
  return result
}

type CSVParser struct{}

func (c CSVParser) Read() string { return "小明,25" }

func (c CSVParser) Process(raw string) any {
  parts := strings.Split(raw, ",")
  return map[string]any{"name": parts[0], "age": parts[1]}
}