模板方法模式是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式通过把不变的部分代码放在父类中,把可变的行为延迟到子类中实现,从而提高了代码的复用性。
下面是一个使用Go语言实现的模板方法模式示例。我们将创建一个咖啡制作流程的模板方法,然后由不同的子类实现具体的制作步骤。
package main
import "fmt"
// 抽象类:CoffeeBuilder
type CoffeeBuilder interface {
Brew()
AddCondiments()
Pour()
}
// 具体类:EspressoBuilder
type EspressoBuilder struct{}
func (e EspressoBuilder) Brew() {
fmt.Println("Dripping espresso")
}
func (e EspressoBuilder) AddCondiments() {
fmt.Println("Adding sugar and milk")
}
func (e EspressoBuilder) Pour() {
fmt.Println("Pouring into a cup")
}
// 具体类:HouseBlendBuilder
type HouseBlendBuilder struct{}
func (h HouseBlendBuilder) Brew() {
fmt.Println("Dripping house blend coffee")
}
func (h HouseBlendBuilder) AddCondiments() {
fmt.Println("Adding cinnamon and vanilla")
}
func (h HouseBlendBuilder) Pour() {
fmt.Println("Pouring into a mug")
}
// 模板方法类:CoffeeMaker
type CoffeeMaker struct {
builder CoffeeBuilder
}
func (c *CoffeeMaker) SetBuilder(builder CoffeeBuilder) {
c.builder = builder
}
func (c *CoffeeMaker) MakeCoffee() {
c.builder.Brew()
c.builder.AddCondiments()
c.builder.Pour()
}
func main() {
espresso := EspressoBuilder{}
houseBlend := HouseBlendBuilder{}
coffeeMaker := CoffeeMaker{}
coffeeMaker.SetBuilder(espresso)
fmt.Println("Making espresso:")
coffeeMaker.MakeCoffee()
coffeeMaker.SetBuilder(houseBlend)
fmt.Println("Making house blend:")
coffeeMaker.MakeCoffee()
}
在这个示例中,CoffeeBuilder
接口定义了咖啡制作的步骤。EspressoBuilder
和HouseBlendBuilder
是具体的实现类,它们实现了CoffeeBuilder
接口,并提供了具体的制作步骤。
CoffeeMaker
类是模板方法类,它持有一个CoffeeBuilder
类型的引用,并实现了MakeCoffee
模板方法,该方法定义了咖啡制作的流程。
在main
函数中,我们创建了不同类型的咖啡制作器,并设置了相应的咖啡制作流程,然后调用MakeCoffee
方法来制作咖啡。模板方法模式用来定义算法的框架,并允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式在处理多个子类有共同算法框架但具体实现步骤不同的情况下非常有用。
如果您喜欢我的文章,请点击下面按钮随意打赏,您的支持是我最大的动力。
最新评论