设计模式:模板方法模式(Python)

此模式通过一个模板方法来定义程序的框架或算法,通常模板方法定义在基类中,即原始的模板,然后子类就可以根据不同的需要实现或重写模板方法中的某些算法步骤或者框架的某部分,最后达到使用相同模板实现不同功能的效果。

核心思想:

  • 使用一个模板方法定义好总的算法框架。
  • 子类中根据需要重新定义某些操作,但是不能修改原始模板方法。
  • 在多个算法或框架具有类似或相同的逻辑的时候,可以使用模板方法模式,以实现代码重用。
  • 当某些操作是强制子类必须实现的时候,此操作就可以定义为抽象方法,如果不是强制要求子类实现的话,则可以在基类中为它定义一个默认实现。

主要角色:

  • 接口:通常是抽象基类,定义模板方法中需要的各项操作。
  • 模板方法:即模板算法,定义好各项操作的执行顺序或算法框架。
  • 真实对象:子类通过重新实现接口中的各项操作,以便让模板方法实现不同的功能。

优缺点:

  • 优点:因为子类的实现是根据基类中的模板而来的,所以可以实现代码重用,因为有时候我们需要修改的只是模板方法中的部分操作而已。
  • 缺点:此模式的维护有时候可能会很麻烦,因为模板方法是固定的,一旦模板方法本身有修改的时候,就可能对其他的相关实现造成影响。

模板方法运用案例--钩子

    钩子是在基类中声明的方法,并且在模板方法中使用它,通常是给它定义好一个默认的实现,钩子的思想是为子类提供一个按需“钩取”的能力,因此如果子类不想使用钩子,则可以忽略钩子的相关实现。

简单示例:

复制代码
from abc import ABCMeta, abstractmethod


class Template(metaclass=ABCMeta):
    """接口:模板类"""
    @abstractmethod
    def operation_1(self):
        pass

    @abstractmethod
    def operation_2(self):
        pass

    def template_func(self):
        """模板方法:定义好具体的算法步骤或框架"""
        self.operation_1()
        self.operation_2()


class SubObj1(Template):
    """子类1:按需重新定义模板方法中的算法操作"""
    def operation_1(self):
        print('SubObj1.operation_1()')

    def operation_2(self):
        print('SubObj1.operation_2()')


class SubObj2(Template):
    """子类2:按需重新定义模板方法中的算法操作"""
    def operation_1(self):
        print('SubObj2.operation_1()')

    def operation_2(self):
        print('SubObj2.operation_2()')


if __name__ == '__main__':
    SubObj1().template_func()
    SubObj2().template_func()
复制代码

 

posted @   山上下了雪-bky  阅读(583)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示