一、什么是策略模式

策略模式定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

二、策略模式的结构

策略层为context定义了一系列的可供重用的算法或行为

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象

三、策略模式的实例

定义一个所有支持的算法的公共接口

class Operation:
    def operation(self, number_a, number_b):
        pass

定义具体的算法,继承公共的接口

class OperationAdd(Operation):
    """加算法"""
    def operation(self, number_a, number_b):
        return number_a + number_b

class OperationSub(Operation):
    """减算法"""
    def operation(self, number_a, number_b):
        return  number_a - number_b

class OperationMul(Operation):
    """乘算法"""
    def operation(self, number_a, number_b):
        return number_a * number_b

class OperationDiv(Operation):
    """除算法"""
    def operation(self, number_a, number_b):
        if number_b == 0:
            return "分母不能为0!"
        else:
            return number_a / number_b

建一个context文件,可以结合简单工厂模式,维护对Operation类的引用

class context:
    def __init__(self, operator):
        if operator == '+':
            self.__ope = OperationAdd()
        if operator == '-':
            self.__ope = OperationSub()
        if operator == '/':
            self.__ope = OperationDiv()
        if operator == '*':
            self.__ope = OperationMul()

    def execute_operation(self, number_a, number_b):
        return self.__ope.operation(number_a, number_b)

最后调用context

if __name__ == '__main__':
    context0 = context("+")
    print(context0.execute_operation(5, 6))

    context1 = context("-")
    print(context1.execute_operation(5, 6))

    context2 = context("/")
    print(context2.execute_operation(5, 0))

    context3 = context("*")
    print(context3.execute_operation(5, 6))

 

以下为复制内容:

1. 何时使用

  • 一个系统有许多类,而区分它们的只是他们直接的行为时

2. 方法

  • 将这些算法封装成一个一个的类,任意的替换

3. 优点

  • 算法可以自由切换
  • 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
  • 扩展性良好,增加一个策略只需实现接口即可
  • 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

4. 缺点

  • 策略类数量会增多,每个策略都是一个类,复用的可能性很小
  • 所有的策略类都需要对外暴露

5. 使用场景

  • 多个类只有算法或行为上稍有不同的场景
  • 算法需要自由切换的场景
  • 需要屏蔽算法规则的场景

6. 应用实例

  • 出行方式,自行车、汽车等,每一种出行方式都是一个策略
  • 商场促销方式,打折、满减等
  • Java AWT中的LayoutManager,即布局管理器

7. 注意事项

  • 如果一个系统的策略多于四个,就需要考虑使用混合模式来解决策略类膨胀的问题

 

 

策略模式

简说设计模式——策略模式

 

 

posted on 2020-04-21 11:03  Q同码  阅读(152)  评论(0编辑  收藏  举报