行为型模式
策略模式
定义
- 定义一些列的算法,把他们一个个封装起来,并且使他们可以相互替换。
- 该模式使得算法可以独立于使用它的客户而变化
实现
场景
- 商场促销:策略A(0.8折)策略B(消费满200.减少80)
from abc import ABC, abstractmethod
class Goods:
def __init__(self, name, price):
self.name = name
self.price = price
class ActivityPolicy(ABC):
@abstractmethod
def pay(self, goods):
pass
class DiscountPolicy(ActivityPolicy):
def pay(self, goods: [Goods]):
total_price = 0.0
for g in goods:
total_price += g.price
print(f"美女买了: {g.name}, 价格: {g.price}")
discount_price = total_price * 0.8
print(f"总价:{total_price}, 折后总共需要支付:{discount_price}元人民币.")
class FullDecrementPolicy(ActivityPolicy):
def pay(self, goods: [Goods]):
total_price = 0.0
for g in goods:
total_price += g.price
print(f"美女买了: {g.name}, 价格: {g.price}")
num = total_price // 200
decr_price = total_price - num * 80
print(f"总价:{total_price}, 折后总共需要支付:{decr_price}元人民币.")
class Lucy:
def __init__(self):
self._goods = []
self._policy = None
def set_policy(self, policy: ActivityPolicy):
self._policy = policy
def add_goods(self, g: Goods):
self._goods.append(g)
def pay(self):
if self._policy:
self._policy.pay(self._goods)
else:
self._pay_of_none_policy()
def _pay_of_none_policy(self):
total_price = 0.0
for g in self._goods:
total_price += g.price
print(f"美女买了:{g.name}, 价格:{g.price}")
print(f"总共需要支付:{total_price}元人民币.")
if __name__ == '__main__':
g1 = Goods("口红", 126.8)
g2 = Goods("面膜", 98.0)
g3 = Goods("羽绒服", 998.9)
g4 = Goods("火锅", 216.5)
lucy = Lucy()
lucy.add_goods(g1)
lucy.add_goods(g2)
lucy.add_goods(g3)
lucy.add_goods(g4)
lucy.pay()
lucy.set_policy(DiscountPolicy())
lucy.pay()
lucy.set_policy(FullDecrementPolicy())
lucy.pay()
美女买了:口红, 价格:126.8
美女买了:面膜, 价格:98.0
美女买了:羽绒服, 价格:998.9
美女买了:火锅, 价格:216.5
总共需要支付:1440.2元人民币.
美女买了: 口红, 价格: 126.8
美女买了: 面膜, 价格: 98.0
美女买了: 羽绒服, 价格: 998.9
美女买了: 火锅, 价格: 216.5
总价:1440.2, 折后总共需要支付:1152.16元人民币.
美女买了: 口红, 价格: 126.8
美女买了: 面膜, 价格: 98.0
美女买了: 羽绒服, 价格: 998.9
美女买了: 火锅, 价格: 216.5
总价:1440.2, 折后总共需要支付:880.2元人民币.
优点
- 策略模式提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活的增加新的算法或行为
- 使用策略模式可以
避免多重条件选择语句
。多重条件选择语句不易维护,它把采取哪一种算法或行为的逻辑与算法或行为本身的实现逻辑混合在一起,将他们全部硬编码在一个庞大的多重条件选择语句中,比直接继承环境类的办法还要原始落后 - 策略模式提供了一种算法的复用机制。由于将算法单独取出来封装在策略类中,因此,不同的环境类可以方便的复用这些策略类