模板模式
优点
在方法中定义一套处理事务的通用逻辑(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观察者模式