模式定义

定义一个操作的算法骨架,而将一些步骤提早到子类中,使得子类能够不扭转一个算法的构造即可重定义该算法某些特定步骤

类图

要点总结

  • Template Method模式是一种十分基础性的设计模式,在面向对象零碎中有着大量的利用(像C++中虚函数的多态性)
  • 除了能够灵便应答子步骤的变动外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型利用

Go语言代码实现

工程目录

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() }