ITPub博客

首页 > 数据库 > 数据库开发技术 > python 面向对象设计模式实践篇(15)-行为型:模板方法实践

python 面向对象设计模式实践篇(15)-行为型:模板方法实践

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-26 15:42:47 0 删除 编辑

行为型模式概述

定义:前篇初期中,我们讲过行为型模式主要解决的问题是:

用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。

特性:

  • 1:关注对象之间的交互和对象的响应
  • 2:对象的交互过程中能保持松散耦合
  • 3:不同的对象之间划分责任和算法的抽象化

模板方法模式


所属分类

  • 行为型模式

意图

  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构就可以重定义该算法某些特定步骤。
  • 使用基本操作定义算法的框架。
  • 重新定义子类的某些操作,而无需修改算法的结构。
  • 实现代码重用并避免重复工作
  • 利用通用接口或实现

适用场景

  • 控制之类的扩展
  • 当子类中的公共行为应该被提取出来并集中到一个公共父类中,避免代码重复,用模版模式进行代码开发可以提供代码复用机制。
  • 当多个算法或类实现类似或相同逻辑的时候。
  • 可以让子类利用覆盖实现行为来定义多个算法的时候。

角色对象

  • 抽象类:定义一组基本方法供子类实现,定义并实现组合了抽内类内部所需的基本方法的模板方法
  • 角色类(对抽象类的实现):实现抽象模板角色定义的基本方法

实践

干饭人的日常步骤:--吃饭方式--选菜--支付--干饭

--吃饭方式:堂食 外卖配送

--支付方式:分现金,支付宝,微信

分析,上面存在变数的行为主要是,可选的部分【吃饭方式】、【支付方式】,不变的是:选菜和开吃。

按模板模式的场景设定的话:

#!/usr/bin/evn python
# coding=utf-8

from abc import ABCMeta, abstractmethod


class EatFood:

    # 可变的部分---吃饭方式
    @abstractmethod
    def _eat_type(self): pass

    # 可变的部分---支付方式
    @abstractmethod
    def _pay_type(self): pass

    # 不变的部分--选菜
    def _select_cai(self):
        return "随便挑菜吃!"

    # 不变的部分--端碗吃饭
    def _star_eat(self):
        return "端碗干饭!!!!!"

    # 一个完整的链路---干饭人的日常链路
    def eat_action(self):
        # 确定吃饭方式
        self._eat_type()
        # 开始选菜
        self._select_cai()
        # 开始给钱
        self._pay_type()
        # 开始吃饭
        self._star_eat()

        return "吃饭方式:%s,选菜%s,支付方式:%s,可以了==>%s" % (self._eat_type(),self._select_cai(), self._pay_type(), self._star_eat())


# 不同的组合方式具体实现类
class WaiMai_WeixinZhifu_EatFood(EatFood):
    '''
    外卖配送+微信支付方式的日常
    '
''
    # 可变的部分确认---吃饭方式
    def _eat_type(self):
        return "外卖配送模式"

    # 可变的部分---支付方式
    def _pay_type(self):
        return "微信支付"


# 不同的组合方式具体实现类
class Tangshi_WeixinZhifu_EatFood(EatFood):
    '''
    堂食模式+支付宝支付方式的日常
    '
''
    # 可变的部分确认---吃饭方式
    def _eat_type(self):
        return "堂食模式,不装饭盒了!"

    # 可变的部分---支付方式
    def _pay_type(self):
        return "支付宝支付"


print(WaiMai_WeixinZhifu_EatFood().eat_action())
print(Tangshi_WeixinZhifu_EatFood().eat_action())

首先定义内部公共的模板方法:

# 不变的部分--选菜
    def _select_cai(self):
        return "随便挑菜吃!"

    # 不变的部分--端碗吃饭
    def _star_eat(self):
        return "端碗干饭!!!!!"

    # 一个完整的链路---干饭人的日常链路
    def eat_action(self):
        # 确定吃饭方式
        self._eat_type()
        # 开始选菜
        self._select_cai()
        # 开始给钱
        self._pay_type()
        # 开始吃饭
        self._star_eat()

然后子类实现可变的部分:

 '''
    堂食模式+支付宝支付方式的日常
    '
''
    # 可变的部分确认---吃饭方式
    def _eat_type(self):
        return "堂食模式,不装饭盒了!"

    # 可变的部分---支付方式
    def _pay_type(self):
        return "支付宝支付"

然后实现对应的具体的实现类,组合不同的实现:

print(WaiMai_WeixinZhifu_EatFood().eat_action())
print(Tangshi_WeixinZhifu_EatFood().eat_action())

输出结果为:

吃饭方式:外卖配送模式,选菜随便挑菜吃!,支付方式:微信支付,可以了==>端碗干饭!!!!!
吃饭方式:堂食模式,不装饭盒了!,选菜随便挑菜吃!,支付方式:支付宝支付,可以了==>端碗干饭!!!!!

上面的:不变部分是对应的模板。可变的部分,是等待子类实配具体的业务的实现的方法。

优缺点

优点:

  • 模板方法通过用的继承而非组合,公共模板方法复用

  • 子类决可以灵活性扩展具体可变算法部分。

缺点:

  • 可变过度的时候,对应的实现类比较多,维护难度大

个人其他博客地址

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

  • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
  • 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111708