当前位置: 首页 > news >正文

设计模式-策略模式、命令模式

目录

策略模式

定义

类图

角色

优缺点

使用场景

命令模式

定义

类图

角色

优缺点

使用场景

使用案例


策略模式

定义

        策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if 判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。

类图

角色

  • Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法
  • Context:环境类/上下文类:
    • 上下文是依赖于接口的类,即上下文包含用策略(接口)声明的变量
    • 上下文提供一个方法,持有一个策略类的引用,最终给客户端调用。该方法委托策略变量调用具体策略所实现的策略接口中的方法
  • ConcreteStrategy:具体策略类:具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法

优缺点

  • 优点
    • 策略模式提供了对“开闭原则"的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
    • 策略模式提供了管理相关的算法族的办法
    • 策略模式提供了可以替换继承关系的办法
    • 使用策略模式可以避免使用多重条件转移语句
  • 缺点
    • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
    • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量

使用场景

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
  • 一个系统需要动态地在几种算法中选择一种
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现
  • 不希望客户端知道复杂的,与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性

命令模式

定义

        将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;可以对请求排队或记录请求日志,以及支持可撤销的操作;

        为了降低系统的耦合度,将请求的发送者和接收者解耦;在命令模式中,发送者与接收者之间引入了新的命令对象,将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法;

类图

角色

  • 接收者(Receiver):负责具体执行一个请求;

  • 命令角色(ICommand):定义需要执行的所有命令行为;

  • 具体的命令角色(ConcreteCommand):内部维护一个 Receiver,具体的命令,实现命令接口;

  • 请求者角色(invoker):接收客户端的命令,并执行命令;

优缺点

优点

  • 通过引入命令的抽象接口,实现了命令请求与实现的解耦;

  • 拓展性良好,可以很容易的增加新命令;增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”对拓展比较灵活

  • 可以实现宏命令,命令模式与组合模式结合,将多个命令装配成一个组合命令,即宏命令;

  • 方便实现Undo,Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复;

缺点

  • 命令类可能过多

使用场景

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互

  • 系统需要在不同的时间指定请求,将请求排队和执行请求

  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作

使用案例

  • Runable

相关文章:

  • 使用vite脚手架搭建react项目
  • 内网穿透的应用-全流程解析如何通过VNC实现Windows与MacOS远程桌面的无缝连接
  • vue2升级Vue3--native、对inheritAttrs作用做以解释、声明的prop属性和未声明prop的属性
  • c语言题目 拷贝函数参数
  • c# 利用mv-cs200-10gc工业相机,识别液注的高度
  • 3DS模拟器使用(pc+安卓)+金手指+存档互传
  • Java蓝桥杯
  • 万邦大数据
  • 词向量:优维大模型语义理解的深度引擎
  • 【华为OD机考真题】- 用户调度问题(Java)
  • C++相关基础概念之入门讲解(上)
  • 全面!陕西省10市企业技术中心申报条件奖补和认定补助材料、时间汇集
  • linux ptrace 图文详解(二) PTRACE_TRACEME 跟踪程序
  • # 使用OpenAI Agents实现智能代理的生命周期管理
  • 32、构造函数
  • CentOS 系统安装 docker 以及常用插件
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
  • mapbox基础,使用线类型geojson加载symbol符号图层,用于标注文字
  • 零信任架构实战手册-企业安全升级
  • 【AD】6-1 PCB常用规则
  • 海南征集民生领域涉嫌垄断违法行为线索,包括行业协会等领域
  • 住建部:截至去年底常住人口城镇化率达到67%
  • 世卫大会再次拒绝涉台提案,国台办:民进党当局再遭挫败理所当然
  • 不赚“快钱”的佳沛:蒋时杰解密新西兰国果如何在中国“慢养”出43亿生意
  • 视觉周刊|走进变革中的博物馆
  • 2025全球城市科技传播能力指数出炉,上海位列第六