模板方法模式
模板方法模式
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法框架,将某些步骤延迟到子类中实现。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法模式的特点
- 定义算法框架:模板方法模式定义了一个算法的骨架,具体步骤由子类实现。
- 基于继承:通过继承机制,子类可以重写父类的方法来实现特定步骤的具体实现。
- 钩子方法:模板方法模式中可以包含钩子方法(Hook),用于控制算法的流程。
模板方法模式的结构
- 抽象类(Abstract Class):定义了一个模板方法
template_method
,其中包含算法的骨架,具体步骤由子类实现。 - 具体类(Concrete Class):实现了抽象类中的抽象方法,完成算法中的具体步骤。
模板方法模式的Python实现
以下是模板方法模式在Python中的一个简单实现示例:
1. 定义抽象类和具体类
from abc import ABC, abstractmethod
# 抽象类
class AbstractClass(ABC):
# 模板方法,定义了算法的骨架
def template_method(self):
self.common_operation1()
self.specialized_operation1()
self.common_operation2()
self.hook()
# 具体步骤1(通用操作1),在子类中实现
def common_operation1(self):
print("AbstractClass: Performing common operation 1")
# 具体步骤2(通用操作2),在子类中实现
def common_operation2(self):
print("AbstractClass: Performing common operation 2")
# 抽象方法,子类必须实现的方法
@abstractmethod
def specialized_operation1(self):
pass
# 钩子方法,子类可以选择性重写的方法
def hook(self):
pass
# 具体类A
class ConcreteClassA(AbstractClass):
def specialized_operation1(self):
print("ConcreteClassA: Performing specialized operation 1")
# 具体类B
class ConcreteClassB(AbstractClass):
def specialized_operation1(self):
print("ConcreteClassB: Performing specialized operation 1")
print("ConcreteClassB: Performing additional operation")
def hook(self):
print("ConcreteClassB: Overridden hook method")
2. 客户端代码
if __name__ == "__main__":
concrete_a = ConcreteClassA()
concrete_a.template_method()
print()
concrete_b = ConcreteClassB()
concrete_b.template_method()
运行结果
AbstractClass: Performing common operation 1
ConcreteClassA: Performing specialized operation 1
AbstractClass: Performing common operation 2
AbstractClass: Performing common operation 1
ConcreteClassB: Performing specialized operation 1
ConcreteClassB: Performing additional operation
AbstractClass: Performing common operation 2
ConcreteClassB: Overridden hook method
说明
- 抽象类(AbstractClass):定义了一个模板方法
template_method
,其中包含了算法的骨架和具体步骤的框架。 - 具体类(ConcreteClassA 和 ConcreteClassB):继承自抽象类,并实现了抽象方法
specialized_operation1
,以及可选的钩子方法hook
。 - 模板方法模式的应用:在客户端代码中,通过具体类的实例来调用模板方法,每个具体类根据自身的实现来执行算法中的特定步骤。
模板方法模式允许定义算法的骨架,而将具体步骤的实现延迟到子类中。这种模式适用于需要在多个类中实现相同算法框架的情况,同时允许每个具体类根据自身需求定制特定步骤的逻辑。