Golang设计模式之模板方法模式

模板方法模式

模板方法模式是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式通过把不变的部分代码放在父类中,把可变的行为延迟到子类中实现,从而提高了代码的复用性。

模板方法模式中的角色

  • AbstractClass(抽象类):定义了模板方法和算法的框架。它实现了一些步骤,这些步骤可以是具体的方法也可以是抽象方法,这些抽象方法将由子类实现。
  • ConcreteClass(具体类):实现AbstractClass中的抽象方法,在这些方法中完成具体逻辑。

Go语言实现示例

下面是一个使用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接口定义了咖啡制作的步骤。EspressoBuilderHouseBlendBuilder是具体的实现类,它们实现了CoffeeBuilder接口,并提供了具体的制作步骤。

CoffeeMaker类是模板方法类,它持有一个CoffeeBuilder类型的引用,并实现了MakeCoffee模板方法,该方法定义了咖啡制作的流程。

main函数中,我们创建了不同类型的咖啡制作器,并设置了相应的咖啡制作流程,然后调用MakeCoffee方法来制作咖啡。模板方法模式用来定义算法的框架,并允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式在处理多个子类有共同算法框架但具体实现步骤不同的情况下非常有用。

打 赏