AIGC提示词:编写模板方法模式文档
2023-06-29 14:55 更新
使用场景: 设计模式实现
中文提示词
模板方法模式:我需要一个能够定义算法框架的模板方法模式,希望文档能够详细、清晰地描述该模式的实现方式,并提供一些实用的代码示例和注意事项。
示例对话
ChatGPT3.5 设计模式实现
用户
模板方法模式:我需要一个能够定义算法框架的模板方法模式,希望文档能够详细、清晰地描述该模式的实现方式,并提供一些实用的代码示例和注意事项。
AI模型(ChatGPT3.5)
### 模板方法模式
模板方法模式是一种行为型设计模式,它允许定义一个算法的框架,而将一些步骤的具体实现交给子类来完成。这种模式可以使得子类在不改变算法结构的情况下,重新定义某些步骤的具体实现。
#### 实现方式
模板方法模式的实现方式如下:
1. 创建一个抽象类,其中包含一个模板方法,该方法定义了算法框架,但是具体实现由子类完成。该类还可以包含一些共同的实现步骤,这些步骤也可以由子类重写。
2. 创建一个或多个具体子类,实现抽象类中定义的模板方法,并重写其中的一些具体实现步骤。
#### 代码示例
```python
from abc import ABC, abstractmethod
class AbstractClass(ABC):
def template_method(self) -> None:
self.base_operation1()
self.required_operation1()
self.base_operation2()
self.hook1()
self.required_operation2()
self.base_operation3()
self.hook2()
def base_operation1(self) -> None:
print('AbstractClass says: I am doing the bulk of the work. This is base_operation1.')
def base_operation2(self) -> None:
print('AbstractClass says: But I let subclasses override some operations. This is base_operation2.')
def base_operation3(self) -> None:
print('AbstractClass says: But I am doing the bulk of the work anyway. This is base_operation3.')
@abstractmethod
def required_operation1(self) -> None:
pass
@abstractmethod
def required_operation2(self) -> None:
pass
def hook1(self) -> None:
pass
def hook2(self) -> None:
pass
class ConcreteClass1(AbstractClass):
def required_operation1(self) -> None:
print('ConcreteClass1 says: Implemented required_operation1.')
def required_operation2(self) -> None:
print('ConcreteClass1 says: Implemented required_operation2.')
class ConcreteClass2(AbstractClass):
def required_operation1(self) -> None:
print('ConcreteClass2 says: Implemented required_operation1.')
def required_operation2(self) -> None:
print('ConcreteClass2 says: Implemented required_operation2.')
def hook1(self) -> None:
print('ConcreteClass2 says: Overridden hook1.')
def client_code(abstract_class: AbstractClass) -> None:
abstract_class.template_method()
if __name__ == '__main__':
print('Client: Testing ConcreteClass1...')
client_code(ConcreteClass1())
print('\nClient: Testing ConcreteClass2...')
client_code(ConcreteClass2())
注意事项
- 模板方法模式的优点在于它允许在不改变算法框架的前提下,实现算法中的某些步骤的具体实现。
- 模板方法模式的缺点在于它可能会带来代码的复杂性,因为需要定义抽象类和具体子类,并在其中实现一些共同的和不同的操作步骤。
- 如果算法框架需要改变,需要修改抽象类的模板方法,这可能会影响所有具体子类的实现。