Go 设计模式中模板模式

鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

 

模板模式原理详细解释:
模板模式(Template Pattern)是一种行为型设计模式,定义了一个算法框架,将其中一些步骤的具体实现延迟到子类中。模板模式通过将通用的算法流程放在父类中,并通过抽象方法和钩子方法来让子类实现具体的步骤,从而实现代码复用和扩展性。

模板模式的核心思想是将算法的结构固定下来,但将某些具体步骤的实现延迟到子类中。父类中定义了一个模板方法,该方法封装了算法的整体结构,它通常是一个具体方法,内部包含了多个抽象方法和具体方法。抽象方法由子类实现,用于定义算法的具体步骤,而具体方法在父类中已经实现好,用于提供算法中的通用逻辑。

底层结构图:
以下是模板模式的经典结构图:

+----------------------------+
|         AbstractClass      |
+----------------------------+
| # TemplateMethod()         |
| - AbstractMethod()         |
| - HookMethod()             |
| + ConcreteMethod()         |
+----------------------------+

        ^
        |
        |
        |
        |
        v

+----------------------------+
|        ConcreteClass       |
+----------------------------+
| - AbstractMethod()         |
| - HookMethod()             |
+----------------------------+

在上述结构图中,AbstractClass 是抽象类,定义了算法的整体结构,并包含了模板方法 TemplateMethod()。它可以是一个具体类,内部包含了多个抽象方法 AbstractMethod() 和一个具体方法 ConcreteMethod(),以及一个可选的钩子方法 HookMethod()

ConcreteClass 是具体子类,继承自 AbstractClass,并实现了其中的抽象方法。它通过实现抽象方法来定义算法的具体步骤,可以重写钩子方法来在算法中添加或修改行为,还可以继承具体方法以重用通用逻辑。

使用场景解释:
模板模式适用于以下场景:

  1. 当有一个算法的整体结构已经确定,但其中某些步骤的具体实现可能各不相同时,可以使用模板模式。模板模式将算法的结构固定下来,而将具体实现延迟到子类中,从而实现代码的复用和扩展。

  2. 当希望在不改变算法结构的情况下,对某些步骤进行定制或扩展时,可以使用模板模式。通过在抽象类中定义钩子方法,子类可以选择性地重写钩子方法来添加或修改算法的行为。

  3. 当有多个类拥有相似的行为逻辑,但具体实现可能不同时,可以使用模板模式。通过将相同的行为逻辑抽象到父类中,子类只需实现特定的步骤,从而实现代码的复用。

代码示例实现:
以下是一个使用Go语言实现模板模式的示例:

package main

import "fmt"

// AbstractClass 抽象类
type AbstractClass interface {
	TemplateMethod()
	AbstractMethod()
	HookMethod()
}

// ConcreteClass 具体子类
type ConcreteClass struct{}

// TemplateMethod 模板方法
func (c *ConcreteClass) TemplateMethod() {
	fmt.Println("TemplateMethod: Start")

	c.AbstractMethod()
	c.HookMethod()

	fmt.Println("TemplateMethod: End")
}

// AbstractMethod 抽象方法
func (c *ConcreteClass) AbstractMethod() {
	fmt.Println("AbstractMethod: Implemented by ConcreteClass")
}

// HookMethod 钩子方法
func (c *ConcreteClass) HookMethod() {
	fmt.Println("HookMethod: Default implementation in ConcreteClass")
}

func main() {
	abstractClass :=&ConcreteClass{}

	abstractClass.TemplateMethod()
}

在上述示例中,我们定义了一个 AbstractClass 接口作为抽象类,其中包含 TemplateMethod()AbstractMethod() 和 HookMethod() 方法。然后,我们实现了具体子类 ConcreteClass,并在其中实现了抽象方法和钩子方法。在 main() 函数中,我们创建了一个 ConcreteClass 的实例,并调用了 TemplateMethod() 方法来执行算法。

文献材料链接:
以下是一些关于模板模式的文献材料链接,供进一步学习和参考:

  1. Design Patterns: Elements of Reusable Object-Oriented Software (GoF book)

  2. Refactoring Guru - Template Method

  3. TutorialsPoint - Template Pattern

  4. SourceMaking - Template Method Pattern

当前都有哪些产品在使用:
模板模式是一种常用的设计模式,在软件开发中有广泛的应用。以下是一些使用模板模式的产品和框架的示例:

  1. Java语言中的java.util.Collections类中的sort()方法就是使用了模板模式。

  2. Spring框架中的JdbcTemplate类也是使用了模板模式,其中的execute()方法就是一个模板方法,而update()query()等方法则是具体的实现。

  3. 某些Web框架中的控制器类通常也使用模板模式,其中定义了处理请求的整体结构,而具体的请求处理方法则由子类实现。

猜你喜欢

转载自blog.csdn.net/feng1790291543/article/details/132160278