zoukankan      html  css  js  c++  java
  • 【设计模式】策略模式

    一、什么是策略模式

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

    二、策略模式的结构

    策略层为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. 注意事项

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

    策略模式

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

     

  • 相关阅读:
    mysql 时间戳
    css优先级
    app横竖屏切换
    文本溢出时显示省略号
    react页面间传递参数
    去掉input获取focus时的边框
    Mac中好用的快捷键
    python 图片处理
    CSS padding margin border属性详解
    python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法
  • 原文地址:https://www.cnblogs.com/CSgarcia/p/12743119.html
Copyright © 2011-2022 走看看