行为型模式概述
定义:前篇初期中,我们讲过行为型模式主要解决的问题是:
用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。
特性:
1:关注对象之间的交互和对象的响应 2:对象的交互过程中能保持松散耦合 3:不同的对象之间划分责任和算法的抽象化
策略模式
所属分类
行为型模式
意图
它定义了一系列的算法,且进行算法封装,且使他们可以相互替换。 可以让算法独立它的客户端,进行相关定制。
角色对象
抽象策略 具体策略 上下文
实践
模拟XXX超时日常的价格销售策略。
星期1——星期3:没任何折扣价(非会员) 星期1——星期3:没任何折扣价(会员9.5折) 星期4: 感恩节(不分非要和会员,统统9折) 星期6:周末大甩卖(不分非要和会员,统统5折)+随机赠送10元购物券

实现:
#!/usr/bin/evn python
# coding=utf-8
from abc import ABCMeta, abstractmethod
class PayMoney(metaclass=ABCMeta):
'''
抽象观察者
'''
@abstractmethod
def pay(self, money): pass
# 星期1——星期3:没任何折扣价(非会员)
class Week_1_3_PayMoney_Not_vip(PayMoney):
def pay(self, money):
return money
# 星期1——星期3:折扣价(会员)
class Week_1_3_PayMoney_vip(PayMoney):
def __init__(self, discount):
self.discount = discount
def pay(self, money):
return money * self.discount
# 星期4: 感恩节(不分非要和会员,统统9折)
class Week_4_PayMoney_Ganen(PayMoney):
def __init__(self, discount):
self.discount = discount
def pay(self, money):
return money * self.discount
# 星期6:周末大甩卖(不分非要和会员,统统5折)+ 赠送10元购物券(可抵扣)
class Week_6_PayMoney_Dsshuaimai(PayMoney):
def __init__(self, discount, gouwujuan_money, is_deduction =True):
self.discount = discount
self.gouwujuan_money = gouwujuan_money
self.is_deduction = is_deduction # 是否抵扣
def pay(self, money):
if self.is_deduction:
return (money * self.discount) - self.gouwujuan_money
return money * self.discount
class Shouyinyuan():
def __init__(self, pay_money):
self.pay_money = pay_money
def check_out(self, pay_all_oney):
return "应收:%s;实收%s" % (pay_all_oney, self.pay_money.pay(pay_all_oney))
#
print('星期1~3上班的收银人---收不是会员的客户(没任何的优惠):', Shouyinyuan(Week_1_3_PayMoney_Not_vip()).check_out(100))
print('星期1~3上班的收银人---收是会员的客户(0.98优惠):', Shouyinyuan(Week_1_3_PayMoney_vip(0.98)).check_out(100))
print('星期4上班的收银人---星期4: 感恩节(不分非要和会员,统统9折):', Shouyinyuan(Week_4_PayMoney_Ganen(0.90)).check_out(100))
print('星期6上班的收银人---周末大甩卖(不分非要和会员,统统5折)+ 赠送10元购物券(可抵扣10元):', Shouyinyuan(Week_6_PayMoney_Dsshuaimai(0.50,10,True)).check_out(100))
print('星期6上班的收银人---周末大甩卖(不分非要和会员,统统5折)+ 赠送10元购物券(不使用抵扣):', Shouyinyuan(Week_6_PayMoney_Dsshuaimai(0.50,10,False)).check_out(100))
输出:
星期1~3上班的收银人---收不是会员的客户(没任何的优惠): 应收:100;实收100
星期1~3上班的收银人---收是会员的客户(0.98优惠): 应收:100;实收98.0
星期4上班的收银人---星期4: 感恩节(不分非要和会员,统统9折): 应收:100;实收90.0
星期6上班的收银人---周末大甩卖(不分非要和会员,统统5折)+ 赠送10元购物券(可抵扣10元): 应收:100;实收40.0
星期6上班的收银人---周末大甩卖(不分非要和会员,统统5折)+ 赠送10元购物券(不使用抵扣): 应收:100;实收50.0
收银员可以应对根据实际情况采取不同的策略,对于不同的策略得出不同的结果,当需要更改策略时,只需要在实例化时传入不同的策略就可以了。
优点和缺点
优点:
如果添加一个策略就要修改一次源代码,违背"开闭原则"(对修改进行关闭原则) 可以定义一系列可重用的算法和行为 可以消除使用if判断条件语句 可以提供 相同行为不同的结果的实现
缺点:
客户需了解所有策略实例。
个人其他博客地址
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
小钟同学 | 文 【原创】| QQ:308711822
1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。
文章转载自小儿来一壶枸杞酒泡茶,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




