模式定义
定义一个操作的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法某些特定步骤
类图
要点总结
- 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()
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。