【Python笔记-设计模式】模板方法模式

一、说明

模板方法模式是一种行为设计模式,就是继承和多态的使用,将通用操作在父类中实现,不同操作的细节在子类中具体实现,父类只声明接口。

(一) 解决问题

  1. 减少相似逻辑的重复代码,提高代码复用性
  2. 提高代码逻辑性,使其易于维护

(二) 使用场景

  • 当有一些操作具有相同的步骤,但具体实现步骤不同时
  • 当需要控制子类的扩展时

二、结构

  1. 抽象类(Abstract­Class)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
  2. 具体类(Concrete­Class)可以重写所有步骤,但不能重写模板方法自身。

三、伪代码

#!/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博客