设计模式之策略模式

介绍

策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换

例如,某一天的出行方式可以是共享单车、汽车、公交车等,这些出行方式,每一种都是一种策略

此模式让算法的变化,不会影响到使用算法的客户

组成

  1. 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口
  2. 具体策略角色:包装了相关的算法和行为
  3. 环境角色:持有一个策略类的引用,最终给客户端调用

代码如下(Python)

"""
    用策略模式模拟商城活动
"""

# 现金收费抽象类
class CashSuper(object):
    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, csuper):
        self.csuper = csuper

    def GetResult(self, money):
        return self.csuper.accept_cash(money)


if __name__ == "__main__":
    money = float(input("原价: "))
    strategy = {}
    strategy[1] = Context(CashNormal())
    strategy[2] = Context(CashRebate(0.8))
    strategy[3] = Context(CashReturn(100, 10))
    mode = float(input("选择折扣方式: 1) 原价 2) 8折 3) 满100减10: "))
    if mode in strategy:
        csuper = strategy[mode]
    else:
        print("不存在的折扣方式")
        csuper = strategy[1]
    print("需要支付: ", csuper.GetResult(money))

结果截图

结果截图

优点

可以避免使用多重条件(if-else)语句,使得代码更加容易维护

缺点

客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况

策略模式需要把每个具体的策略实现都单独封装成类,如果备选策略很多,对象数目则会比较多

评论或私信站长


  1. #该文章暂时没有评论