一、说明
模板方法模式是一种行为设计模式,就是继承和多态的使用,将通用操作在父类中实现,不同操作的细节在子类中具体实现,父类只声明接口。
(一) 解决问题
- 减少相似逻辑的重复代码,提高代码复用性
- 提高代码逻辑性,使其易于维护
(二) 使用场景
- 当有一些操作具有相同的步骤,但具体实现步骤不同时
- 当需要控制子类的扩展时
二、结构
- 抽象类(AbstractClass)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
- 具体类(ConcreteClass)可以重写所有步骤,但不能重写模板方法自身。
三、伪代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
模板方法模式
例:使用模板方法定义饮料制作流程,子类实现或重写具体的制作步骤
"""
from abc import ABC, abstractmethod
class BeverageTemplate(ABC):
"""抽象类(Abstract Class)"""
def prepare_beverage(self):
self.boil_water()
self.brew()
self.pour_in_cup()
if self.customer_wants_condiments():
self.add_condiments()
def boil_water(self):
print("烧水")
@abstractmethod
def brew(self):
pass
def pour_in_cup(self):
print("将水倒进杯子里")
@abstractmethod
def add_condiments(self):
pass
def customer_wants_condiments(self):
return True
class Coffee(BeverageTemplate):
"""具体类(Concrete Class)"""
def brew(self):
print("将咖啡滴过滤网")
def add_condiments(self):
print("加糖和牛奶")
def customer_wants_condiments(self):
return False
class Tea(BeverageTemplate):
"""具体类(Concrete Class)"""
def brew(self):
print("倒入茶叶")
def add_condiments(self):
print("加柠檬")
if __name__ == "__main__":
"""
煮咖啡...
烧水
将咖啡滴过滤网
将水倒进杯子里
==============================
泡茶...
烧水
倒入茶叶
将水倒进杯子里
加柠檬
"""
print("煮咖啡...")
coffee = Coffee()
coffee.prepare_beverage()
print("=" * 30)
print("泡茶...")
tea = Tea()
tea.prepare_beverage()
四、优缺点
优点
- 提高代码复用性:将公共部分抽取到父类中
- 便于维护:只需修改父类即可影响所有子类
- 符合开闭原则:通过增加子类扩展功能,而不修改原有代码
缺点
- 可能导致类的数量增加,增加系统复杂性
- 父类定义了实现框架,子类实现具体步骤,导致子类必须遵循父类的约束,灵活性受限
【Python笔记】设计模式-CSDN博客