设计模式
GoF提出的设计模式有23个,包括:
(1)创建型(Creational)模式:如何创建对象;
(2)结构型(Structural )模式:如何实现类或对象的组合;
(3)行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责。
行为型模式
模板方法模式
模版方法模式使用继承机制,把通用步骤和通用方法放到父类中,把具体实现延迟到子类中实现。使得实现符合开闭原则。
如实例代码中通用步骤在父类中实现(煮开水
、冲泡
、倒入杯中
、添加酌料
)煮开水和冲泡的具体实现留到子类中,并且提供 保存方法的默认实现。
因为Golang不提供继承机制,需要使用匿名组合模拟实现继承。
此处需要注意:因为父类需要调用子类方法,所以子类需要匿名组合父类的同时,父类需要持有子类的引用。
父类
package mainimport "fmt"//抽象类,制作饮料,包裹一个模板的全部实现步骤
type Beverage interface {BoilWater() //煮开水Brew() //冲泡PourInCup() //倒入杯中AddThings() //添加酌料WantAddThings() bool //是否加入酌料Hook
}//封装一套流程模板,让具体的制作流程继承且实现
type template struct {b Beverage
}//封装的固定模板
func (t *template) MakeBeverage() {if t == nil {return}t.b.BoilWater()t.b.Brew()t.b.PourInCup()//子类可以重写该方法来决定是否执行下面动作if t.b.WantAddThings() == true {t.b.AddThings()}
}
子类
测试
func main() {//1. 制作一杯咖啡makeCoffee := NewMakeCaffee()makeCoffee.MakeBeverage() //调用固定模板方法fmt.Println("------------")//2. 制作茶makeTea := NewMakeTea()makeTea.MakeBeverage()
}
参考
Easy 搞定 Golang设计模式