暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python 面向对象设计模式实践篇(14)-行为型:策略模式

小儿来一壶枸杞酒泡茶 2021-03-26
485

行为型模式概述

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

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

特性:

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

策略模式


所属分类

  • 行为型模式

意图

  • 它定义了一系列的算法,且进行算法封装,且使他们可以相互替换。
  • 可以让算法独立它的客户端,进行相关定制。

角色对象


    1. 抽象策略

    1. 具体策略

    1. 上下文

实践

模拟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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论