模式定义

定义一个操作的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法某些特定步骤

类图

image-20210719214301155.png

要点总结

  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用(像C++中虚函数的多态性)
  • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用

Go语言代码实现

工程目录

image-20210705230158141.png

template.go

package Template

//工作流程接口
type WorkInterface interface {
   GetUp()
   Work()
   Sleep()
}

//工作人员绑定了工作流程接口
type Worker struct {
   WorkInterface
}

//工厂模式,生产一个具体的工作人员对象(随时变化的)
func NewWorker(w WorkInterface) *Worker {
   return &Worker{w}
}

//主流程已定好(模板方法),适用于不同的工作人员(稳定不变的)
func (w *Worker) Daily(){
   w.GetUp()
   w.Work()
   w.Sleep()
}

coder.go

package Template

import "fmt"

//程序员类定义
type Coder struct {

}

//程序员方法的具体实现接口
func (c *Coder) GetUp(){
   fmt.Println("coder GetUp.")
}

func (c *Coder) Work(){
   fmt.Println("coder is Coding.")
}

func (c *Coder) Sleep(){
   fmt.Println("coder Sleep.")
}

teacher.go

package Template

import "fmt"

type Teacher struct {

}

func (t *Teacher) GetUp(){
   fmt.Println("teacher GetUp.")
}

func (t *Teacher) Work(){
   fmt.Println("teacher is speaking.")
}

func (t *Teacher) Sleep(){
   fmt.Println("teacher Sleep.")
}

template_test.go

package Template

import "testing"

func TestWorker_Daily(t *testing.T) {
   worker := NewWorker(&Coder{})
   worker.Daily()

   worker = NewWorker(&Teacher{})
   worker.Daily()
}

Yuan_sr
18 声望6 粉丝