模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。(模板方法将算法定义成一组步骤,其中任何步骤都可以是抽象的,由子类负责实现。)
工厂方法是模板方法的一种特殊版本。
钩子:在当前类不做事或实现默认方法,但子类中可以选择实现或者不实现该方法。下面的go模板方法模式中,没办法实现钩子。
钩子目的:1.算法部分可选;2.让子类能够有机会对模板方法中某些即将发生(或刚刚发生)的步骤做出反应。总的来说,钩子让子类有能力为其抽象类作一些决定。
package main
import "fmt"
//抽象,不同步骤
type makeBeverage interface{
brew()
addCondiments()
}
type Beverage struct{
makeBeverage
}
//模板方法
func (b Beverage) prepareRecipe(){
b.boilWater()
b.makeBeverage.brew()
b.pourInCup()
b.makeBeverage.addCondiments()
}
//相同步骤
func (b Beverage) boilWater(){
fmt.Println("boilWater")
}
func (b Beverage) pourInCup(){
fmt.Println("pourInCup")
}
//做茶
type Tea struct{
Beverage
}
func (t Tea) brew(){
fmt.Println("pao cha")
}
func (t Tea) addCondiments(){
fmt.Println("sweet")
}
//做咖啡
type Coffee struct{
Beverage
}
func (c Coffee) brew(){
fmt.Println("pao coffee")
}
func (c Coffee) addCondiments(){
fmt.Println("sugar and milk")
}
func main () {
b := Beverage{}
b.makeBeverage = Tea{}
b.prepareRecipe()
b.makeBeverage = Coffee{}
b.prepareRecipe()
fmt.Println("hello https://tool.lu/")
}