You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
'''
|
|
|
|
|
模板方法模式(Template Method)
|
|
|
|
|
定义算法的骨架,而将一些步骤延迟到子类中实现。
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
|
|
|
|
|
class AbstractClass(ABC):
|
|
|
|
|
def template_method(self):
|
|
|
|
|
# 这是一个模板方法,它定义了一个算法的骨架
|
|
|
|
|
self.base_operation1()
|
|
|
|
|
self.required_operations1()
|
|
|
|
|
self.base_operation2()
|
|
|
|
|
self.hook1()
|
|
|
|
|
self.required_operations2()
|
|
|
|
|
self.base_operation3()
|
|
|
|
|
self.hook2()
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def base_operation1(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def base_operation2(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def base_operation3(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def required_operations1(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def required_operations2(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def hook1(self):
|
|
|
|
|
pass # 钩子操作,子类可以选择是否覆盖
|
|
|
|
|
|
|
|
|
|
def hook2(self):
|
|
|
|
|
pass # 另一个钩子操作
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConcreteClass(AbstractClass):
|
|
|
|
|
def base_operation1(self):
|
|
|
|
|
print("AbstractClass says: I am doing the bulk of the work")
|
|
|
|
|
|
|
|
|
|
def base_operation2(self):
|
|
|
|
|
print("AbstractClass says: But I let subclasses override some operations")
|
|
|
|
|
|
|
|
|
|
def base_operation3(self):
|
|
|
|
|
print("AbstractClass says: But I am doing the bulk of the work anyway")
|
|
|
|
|
|
|
|
|
|
def required_operations1(self):
|
|
|
|
|
print("ConcreteClass says: Implemented Operation1")
|
|
|
|
|
|
|
|
|
|
def required_operations2(self):
|
|
|
|
|
print("ConcreteClass says: Implemented Operation2")
|
|
|
|
|
|
|
|
|
|
def hook1(self):
|
|
|
|
|
print("ConcreteClass says: Overridden Hook1")
|
|
|
|
|
|
|
|
|
|
def hook2(self):
|
|
|
|
|
# 没有覆盖hook2,所以它将执行AbstractClass中的空实现
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
concrete_class = ConcreteClass()
|
|
|
|
|
concrete_class.template_method()
|