模板模式(Template Design Pattern)
在模板模式中,定义一个算法的骨架,然后抽象出来,公开定义执行它的方法模板,使得子类可以不用改变算法的结构就可以从定义该算法的某些特定步骤。模板方法的核心就在于定义了父类一个算法的骨架,子类实现某些具体的细节。
代码示例
在Go语言中,没有了继承,也没有抽象方法,那怎么实现一个模板呢?可以通过内嵌结构体实现。
下面用一个任务模板作为示例,TaskTemplate是一个基础模板,MyTaskTemplate则是在基础模板上增加自定义后的:
package template
import "fmt"
type TaskTemplate struct {
Before func()
After func()
}
func (t TaskTemplate) doTask() {
fmt.Println("do task template")
}
func (t TaskTemplate) Do() {
t.Before()
t.doTask()
t.After()
}
type MyTaskTemplate struct {
TaskTemplate
}
func NewMyTaskTemplate() *MyTaskTemplate {
myTask := &MyTaskTemplate{}
myTask.TaskTemplate.Before = myTask.Before
myTask.TaskTemplate.After = myTask.After
return myTask
}
func (t MyTaskTemplate) Before() {
fmt.Println("befor work")
}
func (t MyTaskTemplate) After() {
fmt.Println("after work")
}
调用:
mytask := NewMyTaskTemplate()
mytask.Do()
// Output:
// befor work
// do task template
// after work