• 设计模式python实现(02)--策略模式


    设计模式python实现(02)--策略模式

    面对算法时常变动

    • 内容:定义一系列的算法,把它们一个个封装起来,并且使得它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。
    • 角色:
      • 抽象策略(Strategy)
      • 具体策略(ConcreteStrategy)
      • 上下文(Context)
    """
    策略模式
    author: panky
    """
    import abc
    
    
    class CashSuper(metaclass=abc.ABCMeta):
        """现金收费抽象类"""
    
        @abc.abstractmethod
        def accept_cash(self, money):
            pass
    
    
    class CashNormal(CashSuper):
        """正常收费子类"""
        def accept_cash(self, money):
            return money
    
    
    class CashRebate(CashSuper):
        """打折收费子类"""
        def __init__(self, discount=1.0):
            self.discount = discount
    
        def accept_cash(self, money):
            return money * self.discount
    
    
    class CashReturn(CashSuper):
        """返利收费子类"""
    
        def __init__(self, money_condition=0, money_return=0):
            self.money_condition = money_condition
            self.money_return = money_return
    
        def accept_cash(self, money):
            if money >= self.money_condition:
                return money - (money / self.money_condition) * self.money_return
            return money
    
    
    class Context(object):
        """具体策略类"""
        def __init__(self, cash_class_obj):
            self.cash_class_obj = cash_class_obj
    
        def get_result(self, money):
            return self.cash_class_obj.accept_cash(money)
    
    
    if __name__ == "__main__":
        input_money = input("原价:")
        strategy = dict()
        strategy[1] = Context(CashNormal())
        strategy[2] = Context(CashRebate(0.8))
        strategy[3] = Context(CashReturn(100, 10))
        mode = input("选择折扣方式: 1)原价 2)8折 3)满100减10:")
        if int(mode) in strategy:
            c_super = strategy[int(mode)]
        else:
            print("不存在的折扣方式")
            c_super = strategy[1]
        print("pay: ", c_super.get_result(float(input_money)))
    

    1264910-20171030111921261-14252556

    使用一个策略类CashSuper定义需要的算法的公共接口,定义三个具体策略类:CashNormal,CashRebate,CashReturn,继承于CashSuper,定义一个上下文管理类,接收一个策略,并根据该策略得出结论,当需要更改策略时,只需要在实例的时候传入不同的策略就可以,免去了修改类的麻烦

  • 相关阅读:
    CORS跨域解决方案
    修改数据库排序规则实践总结
    【转】通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
    调用远程数据库的T-SQL和SP(SQLSERVER)
    解决在微信网页中百度地图定位不准确的问题
    VUE小知识点
    实现鼠标移过时,显示图片的功能
    实现导出功能
    两数据库表之间迁移插入数据
    IIS配置FTP
  • 原文地址:https://www.cnblogs.com/pankypan/p/13539101.html
Copyright © 2020-2023  润新知