Golang设计模式——08模板模式
模板模式
优点
- 在方法中定义一套处理事务的通用逻辑(TemplateMethod),某些步骤交由子类实现。主要作用还是代码复用。
- 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现、
- 在一个方法中定义一个算法的骨架,并将一些具体步骤延迟到子类中实现。
- 模板模式使得子类可以在不改变算法结构的基础上,重新具体定义算法中的某些步骤。
- 简而言之,完成一件事情,有固定的数个步骤,但是会有步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。固定不变的步骤可以抽取到父类中,需要变化的步骤定义为抽象方法由子类实现。
- 提高复用性,提高可扩展性,符合开闭原则
缺点
- 类数目增加
- 继承的缺点,如果父类添加了的新的抽象方法,所有子类都要修改
场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为被提取出来并集中到一个公共父类,从而避免代码重复
代码
package Template
import "fmt"
type WorkInterface interface {
GetUp()
Work()
Sleep()
}
type Worker struct {
WorkInterface
}
func NewWorker(w WorkInterface) *Worker {
return &Worker{WorkInterface: w}
}
func (w *Worker) Daily() {
w.GetUp()
w.Work()
w.Sleep()
}
type Coder struct {
}
func (c *Coder) GetUp() {
fmt.Println("Coder GetUp ")
}
func (c *Coder) Work() {
fmt.Println("Coder Work ")
}
func (c *Coder) Sleep() {
fmt.Println("Coder Sleep ")
}
package Template
import "testing"
func TestWorker_Daily(t *testing.T) {
worker:=NewWorker(&Coder{})
worker.Daily()
}
其他设计模式
设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式