在模板方法模式中,有两个关键组件:
- 抽象类(Abstract Class):它定义了模板方法,该方法包含了算法的骨架,以及一系列抽象方法或具体方法,用于定义算法的各个步骤。
- 具体类(Concrete Class):它继承抽象类,并实现其中的抽象方法,以提供特定步骤的具体实现。
模板方法模式的核心思想是将算法的通用部分定义在抽象类中,而将具体实现延迟到具体子类中。这样,不同的子类可以根据自身的需求来实现算法的具体步骤,同时保持整个算法的一致性和稳定性。
package main
import "fmt"
// Beverage 抽象类
type Beverage interface {
BoilWater()
Brew()
PourInCup()
AddCondiments()
MakeBeverage()
}
// Coffee 具体子类
type Coffee struct{}
func (c *Coffee) BoilWater() {
fmt.Println("煮开水")
}
func (c *Coffee) Brew() {
fmt.Println("冲泡咖啡")
}
func (c *Coffee) PourInCup() {
fmt.Println("倒入杯中")
}
func (c *Coffee) AddCondiments() {
fmt.Println("加入牛奶和糖")
}
func (c *Coffee) MakeBeverage() {
c.BoilWater()
c.Brew()
c.PourInCup()
c.AddCondiments()
fmt.Println("咖啡制作完成")
}
// Tea 具体子类
type Tea struct{}
func (t *Tea) BoilWater() {
fmt.Println("煮开水")
}
func (t *Tea) Brew() {
fmt.Println("浸泡茶叶")
}
func (t *Tea) PourInCup() {
fmt.Println("倒入杯中")
}
func (t *Tea) AddCondiments() {
fmt.Println("加入柠檬")
}
func (t *Tea) MakeBeverage() {
t.BoilWater()
t.Brew()
t.PourInCup()
t.AddCondiments()
fmt.Println("茶制作完成")
}
func main() {
coffee := &Coffee{}
coffee.MakeBeverage()
tea := &Tea{}
tea.MakeBeverage()
}