跳转至

模板方法模式

模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法框架,将某些步骤延迟到子类中实现。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式的特点

  1. 定义算法框架:模板方法模式定义了一个算法的骨架,具体步骤由子类实现。
  2. 基于继承:通过继承机制,子类可以重写父类的方法来实现特定步骤的具体实现。
  3. 钩子方法:模板方法模式中可以包含钩子方法(Hook),用于控制算法的流程。

模板方法模式的结构

  1. 抽象类(Abstract Class):定义了一个模板方法 template_method,其中包含算法的骨架,具体步骤由子类实现。
  2. 具体类(Concrete Class):实现了抽象类中的抽象方法,完成算法中的具体步骤。

模板方法模式的Python实现

以下是模板方法模式在Python中的一个简单实现示例:

1. 定义抽象类和具体类

from abc import ABC, abstractmethod

# 抽象类
class AbstractClass(ABC):
    # 模板方法,定义了算法的骨架
    def template_method(self):
        self.common_operation1()
        self.specialized_operation1()
        self.common_operation2()
        self.hook()

    # 具体步骤1(通用操作1),在子类中实现
    def common_operation1(self):
        print("AbstractClass: Performing common operation 1")

    # 具体步骤2(通用操作2),在子类中实现
    def common_operation2(self):
        print("AbstractClass: Performing common operation 2")

    # 抽象方法,子类必须实现的方法
    @abstractmethod
    def specialized_operation1(self):
        pass

    # 钩子方法,子类可以选择性重写的方法
    def hook(self):
        pass

# 具体类A
class ConcreteClassA(AbstractClass):
    def specialized_operation1(self):
        print("ConcreteClassA: Performing specialized operation 1")

# 具体类B
class ConcreteClassB(AbstractClass):
    def specialized_operation1(self):
        print("ConcreteClassB: Performing specialized operation 1")
        print("ConcreteClassB: Performing additional operation")

    def hook(self):
        print("ConcreteClassB: Overridden hook method")

2. 客户端代码

if __name__ == "__main__":
    concrete_a = ConcreteClassA()
    concrete_a.template_method()
    print()

    concrete_b = ConcreteClassB()
    concrete_b.template_method()

运行结果

AbstractClass: Performing common operation 1
ConcreteClassA: Performing specialized operation 1
AbstractClass: Performing common operation 2

AbstractClass: Performing common operation 1
ConcreteClassB: Performing specialized operation 1
ConcreteClassB: Performing additional operation
AbstractClass: Performing common operation 2
ConcreteClassB: Overridden hook method

说明

  1. 抽象类(AbstractClass):定义了一个模板方法 template_method,其中包含了算法的骨架和具体步骤的框架。
  2. 具体类(ConcreteClassA 和 ConcreteClassB):继承自抽象类,并实现了抽象方法 specialized_operation1,以及可选的钩子方法 hook
  3. 模板方法模式的应用:在客户端代码中,通过具体类的实例来调用模板方法,每个具体类根据自身的实现来执行算法中的特定步骤。

模板方法模式允许定义算法的骨架,而将具体步骤的实现延迟到子类中。这种模式适用于需要在多个类中实现相同算法框架的情况,同时允许每个具体类根据自身需求定制特定步骤的逻辑。

评论