前言

模板方法模式属于行为型模式,假设要开发1个桌面应用,可以确定每个窗口都有开启、关闭、定时重新绘制功能。

一、模板方法模式

模板方法模式主要涉及2个核心类:

  • 抽象类:可以称之为1个父类/接口
  • 具体类:该父类的子类

1.概念

定义1个操作中的算法骨架,而将一些细节的步骤延迟到子类中实现。

模板方法使得子类可以不改变1个算法的结构即可重新定义该算法的某些特点步骤。

2.角色

  • 抽象类(AbstractClass):定义抽象原子操作(钩子操作)、实现1个模板方法作为算法骨架
  • 具体类(ConcreteClass):自动继承抽象类中定义的模板方法、手动实现抽象类中定义的原子/构造操作

3.适用场景

  • 1次性实现1个算法的不变部分
  • 各子类中的公共行为应该被提取出来并集中到1个公共父类中以避免代码重复
  • 控制子类随意扩展

4.代码

from abc import ABC, abstractmethod
from time import sleep


# 抽象类:定义骨架,定义了很多原子/构造操作、固定不变的模板方法
class Window(ABC):
    # 原子/钩子操作:变的东西,需要子类具体实现
    @abstractmethod
    def start(self):
        pass

    # 原子/钩子操作:变的东西,需要子类具体实现
    @abstractmethod
    def repaint(self):
        pass

    # 原子/钩子操作:变的东西,需要子类具体实现
    @abstractmethod
    def stop(self):
        pass

    # 模板方法:框架不变的东西,不需要子类再次实现、和重新
    # 不需要@abstractmethod,子类会自动继承模板方法
    def run(self):
        self.start()
        while True:
            try:
                self.repaint()
                sleep(1)
            except KeyboardInterrupt:
                break
            self.stop()


# 具体类:子类在不改变算法骨架父类(Window类)的前提下,重新定义该算法骨架的某些特定的、需要改变的方法
class MyWindow(Window):
    def __init__(self, msg):
        self.msg = msg

    def start(self):
        print("窗口开始运行")

    def stop(self):
        print("窗口结束运行")

    def repaint(self):
        print(self.msg)


# 高层代码(Client)
if __name__ == '__main__':
    MyWindow("Hello。。").run()

 

 

参考

posted on 2024-02-17 21:08  Martin8866  阅读(4)  评论(0编辑  收藏  举报