Go 语言实现模版方法设计模式
在Go语言中,可以使用接口和组合来实现模板方法模式。模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。下面是一个示例代码,演示了如何在Go中实现模板方法模式:
package main
import "fmt"
// AbstractClass 定义抽象类
type AbstractClass interface {
TemplateMethod()
PrimitiveOperation1()
PrimitiveOperation2()
}
// ConcreteClass1 实现具体的子类1
type ConcreteClass1 struct{}
func (c *ConcreteClass1) TemplateMethod() {
fmt.Println("ConcreteClass1 TemplateMethod")
c.PrimitiveOperation1()
c.PrimitiveOperation2()
}
func (c *ConcreteClass1) PrimitiveOperation1() {
fmt.Println("ConcreteClass1 PrimitiveOperation1")
}
func (c *ConcreteClass1) PrimitiveOperation2() {
fmt.Println("ConcreteClass1 PrimitiveOperation2")
}
// ConcreteClass2 实现具体的子类2
type ConcreteClass2 struct{}
func (c *ConcreteClass2) TemplateMethod() {
fmt.Println("ConcreteClass2 TemplateMethod")
c.PrimitiveOperation1()
c.PrimitiveOperation2()
}
func (c *ConcreteClass2) PrimitiveOperation1() {
fmt.Println("ConcreteClass2 PrimitiveOperation1")
}
func (c *ConcreteClass2) PrimitiveOperation2() {
fmt.Println("ConcreteClass2 PrimitiveOperation2")
}
func main() {
// 使用具体的子类1
class1 := &ConcreteClass1{}
class1.TemplateMethod()
fmt.Println()
// 使用具体的子类2
class2 := &ConcreteClass2{}
class2.TemplateMethod()
}
在上述示例中,AbstractClass
定义了一个抽象类,其中 TemplateMethod
是模板方法,它定义了算法的骨架,调用了两个抽象方法 PrimitiveOperation1
和 PrimitiveOperation2
。ConcreteClass1
和 ConcreteClass2
是具体的子类,它们实现了抽象类的方法。
通过使用接口和组合,我们可以在抽象类中定义模板方法并调用子类的抽象方法,从而实现模板方法模式。在示例中,TemplateMethod
是抽象类中的模板方法,它调用了 PrimitiveOperation1
和 PrimitiveOperation2
方法,具体的子类根据自己的需求来实现这些抽象方法。
运行上述代码将输出以下结果:
ConcreteClass1 TemplateMethod
ConcreteClass1 PrimitiveOperation1
ConcreteClass1 PrimitiveOperation2
ConcreteClass2 TemplateMethod
ConcreteClass2 PrimitiveOperation1
ConcreteClass2 PrimitiveOperation2
可以看到,模板方法 TemplateMethod
在抽象类中定义,并且调用了具体子类实现的抽象方法 PrimitiveOperation1
和 PrimitiveOperation2
。这样,我们就实现了模板方法模式,通过基类调用子类的抽象方法来完成算法的定制化。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: