文章目录
- 9.1 模板方法模式概述
- 9.2 代码示例
- 9.3 模板方法模式的UML图
- 9.4 模板方法模式的优点和缺点
- 9.4.1 模板方法模式提供以下优点:
- 9.4.2 模板方法模式的缺点如下:
9.1 模板方法模式概述
模板方法模式是一种行为设计模式,它使用一个抽象的基类定义了一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法中的某些步骤。
9.2 代码示例
在Python中使用模板方法模式时,首先需要定义一个抽象基类,其中包含一个模板方法,该方法定义了算法的骨架,以及一些抽象方法,这些方法需要在子类中实现。然后,子类可以继承抽象基类,并实现其中定义的抽象方法,以完成算法的具体实现。
下面是一个使用模板方法模式的示例:
from abc import ABC, abstractmethod
# 定义抽象基类
class AbstractClass(ABC):
def template_method(self):
self.step_one()
self.step_two()
self.step_three()
@abstractmethod
def step_one(self):
pass
@abstractmethod
def step_two(self):
pass
@abstractmethod
def step_three(self):
pass
# 定义具体子类
class ConcreteClass(AbstractClass):
def step_one(self):
print("Step one")
def step_two(self):
print("Step two")
def step_three(self):
print("Step three")
# 使用具体子类
obj = ConcreteClass()
obj.template_method()
在上面的示例中,AbstractClass是抽象基类,其中定义了一个template_method方法作为算法的骨架,以及三个抽象方法step_one、step_two和step_three。ConcreteClass是具体子类,它继承了AbstractClass,并实现了其中的抽象方法。通过调用template_method方法,可以执行算法的整个过程。
9.3 模板方法模式的UML图
模板方法模式的主要角色有:抽象类、具体类、模版方法和客户端。下面,让我们把这些角色放入一个UML图中(见下图),看看这些类是如何关联的。
通过观察下面的UML图,你会发现这个模式有4个主要参与者。
- AbstractClass:在抽象方法的帮助下定义算法的操作或步骤。这些步骤将被具
体子类覆盖。 - template_method():定义算法的框架。在模板方法中调用抽象方法定义的多
个步骤来定义序列或算法本身。 - ConcreteClass:实现(由抽象方法定义的)步骤,来执行算法子类的特定步骤。
9.4 模板方法模式的优点和缺点
9.4.1 模板方法模式提供以下优点:
- 由于模板方法模式使用继承而不是合成,因此能够对代码进行重用。所以,只有为
数不多的几个方法需要重写; - 灵活性允许子类决定如何实现算法中的步骤。
9.4.2 模板方法模式的缺点如下:
- 调试和理解模板方法模式中的流程序列有时会令人困惑。你最终实现的方法可能是
一个不应该实现的方法,或根本没有实现抽象方法。文档和严格的错误处理必须由
程序员完成; - 模板框架的维护可能是一个问题,因为任何层次(低层或高层)的变更都可能对实
现造成干扰。因此,使用模板方法模式可能会使维护变得异常痛苦。