• 策略模式


    概述:

            在软件开发中经常遇到类似的情况,实现某一功能有多种算法或者策略,我们可以根据环境或条件的不同选择不同的算法或策略来完成功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

          策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)

    适用性

    当存在以下情况时使用Strategy模式
    1)• 许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
    2)• 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间 /时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。
    3)• 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构
    4)• 一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

    环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
    抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
    具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

    优点:

    1) 相关算法系列 Strategy类层次为Context定义了一系列的可供重用的算法或行为。

    2) 提供了可以替换继承关系的办法:
    3) 消除了一些if else条件语句 :
    4) 实现的选择 Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择。

    Strategy模式缺点:

    1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类:
    2 ) Strategy和Context之间的通信开销 :
    3 )策略模式将造成产生很多策略类:

  • 相关阅读:
    SASL简单认证和安全框架
    最详细的git rebase解释文章
    基于钻孔数据的三维地质模型可视化
    数字孪生 3D 风电场,智慧风电之陆上风电
    石油储运生产 2D 可视化,组态应用赋能工业智慧发展
    在抽象类中使用@Autowired
    vue点击复制
    利用PHPJWT实现token及刷新token
    PHP win32service Windows 系统后台服务
    SeasLog PHP 日志扩展
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7471321.html
Copyright © 2020-2023  润新知