定义:前篇初期中,我们讲过行为型模式主要解决的问题是:
用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。
特性:
干饭人的日常步骤:--吃饭方式--选菜--支付--干饭
--吃饭方式:堂食 外卖配送
--支付方式:分现金,支付宝,微信
分析,上面存在变数的行为主要是,可选的部分【吃饭方式】、【支付方式】,不变的是:选菜和开吃。
按模板模式的场景设定的话:
#!/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:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。