模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[DP]
模板方法模式提供了一个很好的代码复用平台,通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
有时候,我们会遇到由一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但有些步骤的实现可能不同。当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。这时候通常就应该要考虑用模板方法模式。
// 需要实现的接口
type Interface interface {
PrimitiveMethod1()
PrimitiveMethod2()
}
// 模板"类"
type Template struct {
Methods Interface
}
func (t *Template) TemplateMethod(){
t.Methods.PrimitiveMethod1()
t.Methods.PrimitiveMethod2()
}
// 这里可以实现一些公共步骤
func (t *Template) PrimitiveMethod1() {
fmt.Println("Calling method1 of template")
}
func (t *Template) PrimitiveMethod2() {
fmt.Println("Calling method2 of template")
}
// "子类"1
type Concrete1 struct {
Template
}
func (c *Concrete1) PrimitiveMethod1() {
fmt.Println("Calling method1 of concrete1")
}
func (c *Concrete1) PrimitiveMethod2() {
fmt.Println("Calling method2 of concrete1")
}
// "子类"2
type Concrete2 struct {
Template
}
func (c *Concrete2) PrimitiveMethod1() {
fmt.Println("Calling method1 of concrete2")
}
func (c *Concrete2) PrimitiveMethod2() {
fmt.Println("Calling method2 of concrete2")
}
func main() {
var client Template
client.Methods = &Concrete1{
}
client.TemplateMethod()
client.Methods = &Concrete2{
}
client.TemplateMethod()
}