设计模式——策略模式

文章目录

  • 前言
  • [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会创建和传递一些永远用不到的参数
  • 增加了类和对象数目,因为各种算法被抽取出来单独成类,导致了对象数目增加,这种情况在算法较多时更加严重。

总结

未完待续

相关推荐
HEU_firejef6 小时前
设计模式——工厂模式
java·开发语言·设计模式
DBWYX6 小时前
GoF23种设计模式 简介
设计模式·面向对象
诸葛悠闲10 小时前
设计模式——外观模式
设计模式·外观模式
玉面小君14 小时前
C# 设计模式(结构型模式):代理模式
设计模式·c#·代理模式
MinBadGuy14 小时前
【GeekBand】C++设计模式笔记20_Composite_组合模式
c++·设计模式
渊渟岳14 小时前
掌握设计模式--组合模式
设计模式
玉面小君14 小时前
C# 设计模式(创建型模式):建造者模式
设计模式·c#·建造者模式
玉面小君14 小时前
C# 设计模式(结构型模式):外观模式
设计模式·c#·外观模式
屋外雨大,惊蛰出没16 小时前
策略模式(strategy)
策略模式
lshzdq16 小时前
【设计模式】依赖注入(Dependency Injection, DI)
c++·设计模式·c#