乐趣区

关于设计模式:设计模式模板方法Template-Method模式

模式定义

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

类图

要点总结

  • 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()}
退出移动版