什么是模板方法模式?
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
实现
// 抽象打工人
type WorkInterfact interface {
// 起床
GetUp()
// 工作
Work()
// 睡觉
Sleep()
}
type Worker struct {
WorkInterfact
}
func NewWorker(w WorkInterfact) *Worker {
return &Worker{w}
}
func (this *Worker)Daily() {
this.GetUp()
this.Work()
this.Sleep()
}
// 具体打工人
type Coder struct {
}
func NewCoder() *Coder {
return &Coder{}
}
func (this *Coder)GetUp() {
fmt.Println("Coder GetUp")
}
func (this *Coder)Work() {
fmt.Println("Coder Work")
}
func (this *Coder)Sleep() {
fmt.Println("Coder Sleep")
}
func TestNewWorker(t *testing.T) {
worker := NewWorker(NewCoder())
worker.Daily()
}
// === RUN TestNewWorker
// Coder GetUp
// Coder Work
// Coder Sleep
// --- PASS: TestNewWorker (0.00s)
// PASS
优点
- 封装不变部分,扩展可变部分;
- 提取公共部分代码,便于维护;
- 行为由父类控制,子类实现。
缺点
- 每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大。
使用场景
- 有多个子类共有的方法,且逻辑相同;
- 重要的、复杂的方法,可以考虑作为模板方法;
- 重构时,模板方法模式是一个经常使用到的模式,把相同的代码抽取到父类中,通过钩子函数约束其行为。
网友评论