您的位置:首页 > 健康 > 美食 > 科技作品手工_湛江建设免费网站_吉林seo推广_百度提问首页

科技作品手工_湛江建设免费网站_吉林seo推广_百度提问首页

2025/1/4 19:47:42 来源:https://blog.csdn.net/qq_56086076/article/details/144843436  浏览:    关键词:科技作品手工_湛江建设免费网站_吉林seo推广_百度提问首页
科技作品手工_湛江建设免费网站_吉林seo推广_百度提问首页

文章目录

  • 前言
  • 1 策略模式的定义
  • 2 策略模式的结构
  • 3 策略模式的效果分析
  • 总结


前言

策略模式是一种行为型设计模式,本文将重点介绍这一设计模式的定义和结构。

1 策略模式的定义

策略模式:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化

模式动机:
• 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
• 在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。

由来:

  • 多种算法实现同一功能,客户希望在运行时根据上下文选择其中一个算法
  • 传统策略算法的缺点
    • 使用算法的类复杂而难于维护,尤其当需要支持多种算法且每种算法都很复杂时问题会更加严重
    • 不同的时候需要不同的算法,支持并不使用的算法可能带来性能的负担
    • 算法的实现和使用算法的对象紧紧耦合在一起,使新增算法或修改算法
      变得十分困难,系统应对变化的能力很差
  • 将每种算法的实现都剥离出来构成一个个独立算法对象,再从这些对象中抽象出公共算法接口,最后将算法接口组合到使用算法类中

策略模式的意图与适用性:

  • 意图:
    • 定义一系列算法,一个个进行封装,并使其可相互替换。策略模式使得算法可独立于使用它的客户而变化。
  • 适用场合:
    • 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使得对象变得异常复杂;而且有时候支持不同的算法也是一个性能负担。
    • 如何在运行时根据需要透明地更改对象的算法?如何将算法与对象本身解耦,从而避免上述问题?策略模式很好地解决了这两个问题。

2 策略模式的结构

在这里插入图片描述
策略模式的参与者:

  • Strategy:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
    • 定义所有支持算法的公共接口。
    • Context使用该接口调用某ConcreteStrategy定义的算法。
  • ConcreteStrategy:实现了抽象策略定义的接口,提供具体的算法实现或行为。
  • Context:持有一个策略类的引用,最终给客户端调用。
    • 用一个ConcreteStrategy对象来配置
    • 维护一个对Strategy对象的引用
    • 可定义一个接口来让Strategy访问它的数据

3 策略模式的效果分析

  • 算法和使用算法的对象相互分离,客户程序可以在运行时动态选择算法,
    代码复用性好,便于修改和维护
  • 用组合替代继承,效果更好。若从Context直接生成子类,也可以实现对象的多种算法,但继承使子类和父类紧密耦合,使Context类难以理解、难以维护和难以扩展。策略模式采用组合方式,使Context和Strategy之间的依赖很小,更利于代码复用
  • 消除了冗长的条件语句序列,将不同的算法硬编码进一个类中,选择不同的算法必然要使用冗长的条件语句序列,采用策略模式将算法封装在一个个独立的Strategy类中消除了这些条件语句
  • 算法的动态选择,Strategy模式可以提供相同行为的不同实现,客户可以
    根据不同的上下文从不同的策略中选择算法
  • 客户必须了解不同的Strategy,一个客户要选择一个合适的Strategy就必
    须知道这些Strategy到底有什么不同
  • Strategy和Context之间的通信开销加大,根据算法的需要,Context必须
  • 向每个不同的具体Strategy类实例传递不同的参数,因此Strategy接口就要传递所有这些不同参数的集合,导致Context会创建和传递一些永远用不到的参数
  • 增加了类和对象数目,因为各种算法被抽取出来单独成类,导致了对象数目增加,这种情况在算法较多时更加严重。

总结

未完待续

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com