16. 模板方法模式(Template Method)
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]}
}