使用Python实现模板方法模式
模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。在Python中,我们可以通过继承和重写方法来实现模板方法模式。
下面是一个使用Python实现模板方法模式的完整样例代码:
python
# 定义一个抽象基类
from abc import ABCMeta, abstractmethod
class AbstractClass(metaclass=ABCMeta):
# 定义模板方法
def template_method(self):
self.hook()
self.primitive_operation_1()
self.primitive_operation_2()
# 定义钩子方法,子类可以选择性地重写
def hook(self):
pass
# 定义抽象方法,需要子类实现
@abstractmethod
def primitive_operation_1(self):
pass
@abstractmethod
def primitive_operation_2(self):
pass
# 实现具体子类
class ConcreteClass1(AbstractClass):
def primitive_operation_1(self):
print("具体子类1的操作1")
def primitive_operation_2(self):
print("具体子类1的操作2")
class ConcreteClass2(AbstractClass):
def primitive_operation_1(self):
print("具体子类2的操作1")
def primitive_operation_2(self):
print("具体子类2的操作2")
# 使用具体子类
def main():
concrete_class1 = ConcreteClass1()
concrete_class1.template_method()
concrete_class2 = ConcreteClass2()
concrete_class2.template_method()
if __name__ == '__main__':
main()
在这个例子中,我们定义了一个抽象基类`AbstractClass`,它包含了一个模板方法`template_method`和两个抽象方法`primitive_operation_1`和`primitive_operation_2`。具体的子类`ConcreteClass1`和`ConcreteClass2`继承自`AbstractClass`并实现了这两个抽象方法。
在`template_method`中,首先调用了钩子方法`hook`,然后按照固定的顺序执行了`primitive_operation_1`和`primitive_operation_2`。子类可以选择性地重写钩子方法,但必须实现抽象方法。
在`main`函数中,我们通过创建具体子类的实例并调用`template_method`来使用模板方法模式。运行代码会输出:
具体子类1的操作1
具体子类1的操作2
具体子类2的操作1
具体子类2的操作2
这表明模板方法模式成功地将通用算法的实现与具体子类的实现分离了开来。