ITPub博客

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

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

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

行为型模式概述

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

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

特性:

  • 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:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


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

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

    注册时间:2021-02-20

    • 博文量
      224
    • 访问量
      111708