简介
模板模式是一种行为型设计模式,它定义了一个实现模板的骨架,将一些步骤推迟到子类,模板模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板模式涉及到一下几个角色:
模板类 AbstractClass
定义一个骨架,其中包含了一系列的步骤,这些步骤可以包含抽象方法、具体方法以及钩子方法等等。
具体模板类 ConcreteClass
实现了模板类的抽象方法,完成算法中特定步骤的具体实现,具体模版类也可以覆盖钩子方法
一辆车,开车的步骤是什么?开门、点火、起步,但是有的人可能还需要听歌,那么开音乐就放在钩子放里面,根据自己的喜爱来。
Demo
// AbstractDrive 模板类
type AbstractDrive interface {
OpenDoor()
Fire()
Going()
Hook()
}
type Driver struct {
AbstractDrive
}
func NewDriver(abstract AbstractDrive) *Driver {
return &Driver{
abstract,
}
}
func (d *Driver) Template() {
d.OpenDoor()
d.Fire()
d.Going()
d.Hook()
}
// CommonTemplate 具体模板类
type CommonTemplate struct {
}
func (d *CommonTemplate) OpenDoor() {
fmt.Println("开门")
}
func (d *CommonTemplate) Fire() {
fmt.Println("点火")
}
func (d *CommonTemplate) Going() {
fmt.Println("起步")
}
// Hook 钩子方法,子类可以选择性地覆盖
func (d *CommonTemplate) Hook() {
fmt.Println("开启音乐")
}
测试
func TestTemplate(t *testing.T) {
commonDriver := NewDriver(&CommonTemplate{})
commonDriver.Template()
}
CommonTemplate我们定义了通用的实现模板类,也定义了一个默认的司机Driver,如果你希望在开门就播放音乐,那么你可以定一个DIYDriver,在你的Template去更换顺序。 在具体模板类中,我们可以选择性地覆盖钩子方法,以实现一些特定的行为。
作用和场景
定义实现模式骨架
模板模式主要就是定一个骨架,然后你具体如何实现则放到子类中、
封装通用行为
将算法中的通用行为放在模板类中,可以确保这些通用行为在整个算法中保持一致,避免了重复的代码。
子类扩展 子类可以选择性地覆盖或扩展模板类中的方法,从而实现特定步骤的定制。
板模式适用于多个子类有相同的算法结构,但其中某些步骤的具体实现可能不同的情况。或者是一些状态机中的状态流程图等等,为每个状态扭转都定义不同的模板,然后根据模板走。