设计模式--第二十三章 模板模式

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1. 核心思想

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2. UML类图

模板模式UML类图

3. 框架代码

from abc import ABC,abstractmethod
import sys

class Template(ABC):
    @abstractmethod
    def stepOne(self):
        pass

    @abstractmethod
    def stepTwo(self):
        pass

    def templateMethod(self):
        self.stepOne()
        self.stepTwo()

class TemplateImplA(Template):
    def stepOne(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

    def stepTwo(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

class TemplateImplB(Template):
    def stepOne(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

    def stepTwo(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

if __name__ == "__main__":
    a = TemplateImplA()
    a.templateMethod()
    print()
    b = TemplateImplB()
    b.templateMethod()

4. 模型说明

4.1 设计要点

两个重要的组成部分:

  1. 抽象模板类(Template):把不变的行为、方法和属性移到父类中,去除子类中的重复代码来体现它的优势;
  2. 模板类具体子类(TemplateImpl):子类实现模板父类的某些细节,满足个性化的需求;

4.2 优缺点

  1. 优点
    • 模板方法模式是通过把不变的行为挪到一个统一的父类,从而达到去除子类中重复代码的目的。
    • 子类实现模板父类的某些细节,有助于模板父类的扩展。
    • 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
  2. 缺点
    • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

5. 应用场景

  1. 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。即一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
  2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  3. 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值