鱼弦: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
,并实现了其中的抽象方法。它通过实现抽象方法来定义算法的具体步骤,可以重写钩子方法来在算法中添加或修改行为,还可以继承具体方法以重用通用逻辑。
使用场景解释:
模板模式适用于以下场景:
-
当有一个算法的整体结构已经确定,但其中某些步骤的具体实现可能各不相同时,可以使用模板模式。模板模式将算法的结构固定下来,而将具体实现延迟到子类中,从而实现代码的复用和扩展。
-
当希望在不改变算法结构的情况下,对某些步骤进行定制或扩展时,可以使用模板模式。通过在抽象类中定义钩子方法,子类可以选择性地重写钩子方法来添加或修改算法的行为。
-
当有多个类拥有相似的行为逻辑,但具体实现可能不同时,可以使用模板模式。通过将相同的行为逻辑抽象到父类中,子类只需实现特定的步骤,从而实现代码的复用。
代码示例实现:
以下是一个使用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()
方法来执行算法。
文献材料链接:
以下是一些关于模板模式的文献材料链接,供进一步学习和参考:
-
Design Patterns: Elements of Reusable Object-Oriented Software (GoF book)
-
Refactoring Guru - Template Method
-
TutorialsPoint - Template Pattern
-
SourceMaking - Template Method Pattern
当前都有哪些产品在使用:
模板模式是一种常用的设计模式,在软件开发中有广泛的应用。以下是一些使用模板模式的产品和框架的示例:
-
Java语言中的
java.util.Collections
类中的sort()
方法就是使用了模板模式。 -
Spring框架中的JdbcTemplate类也是使用了模板模式,其中的
execute()
方法就是一个模板方法,而update()
和query()
等方法则是具体的实现。 -
某些Web框架中的控制器类通常也使用模板模式,其中定义了处理请求的整体结构,而具体的请求处理方法则由子类实现。