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