设计模式——策略模式

文章目录

  • 前言
  • [1 策略模式的定义](#1 策略模式的定义)
  • [2 策略模式的结构](#2 策略模式的结构)
  • [3 策略模式的效果分析](#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会创建和传递一些永远用不到的参数
  • 增加了类和对象数目,因为各种算法被抽取出来单独成类,导致了对象数目增加,这种情况在算法较多时更加严重。

总结

未完待续

相关推荐
vker6 小时前
第 1 天:单例模式(Singleton Pattern)—— 创建型模式
java·设计模式
晨米酱1 天前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机1 天前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript