设计模式——策略模式

行为型模式

策略模式

定义

  • 定义一些列的算法,把他们一个个封装起来,并且使他们可以相互替换。
  • 该模式使得算法可以独立于使用它的客户而变化

实现

场景
  • 商场促销:策略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()

    # 参加8折活动
    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元人民币.
优点
  1. 策略模式提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活的增加新的算法或行为
  2. 使用策略模式可以避免多重条件选择语句。多重条件选择语句不易维护,它把采取哪一种算法或行为的逻辑与算法或行为本身的实现逻辑混合在一起,将他们全部硬编码在一个庞大的多重条件选择语句中,比直接继承环境类的办法还要原始落后
  3. 策略模式提供了一种算法的复用机制。由于将算法单独取出来封装在策略类中,因此,不同的环境类可以方便的复用这些策略类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值