文章目录

  • 概述
  • 命令模式
  • 策略模式
  • 相同点
  • 总结

概述

命令模式策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色。它们虽然同为行为类模式,但是两者的区别还是很明显的。策略模式的意图是封装算法,它认为“算法”已经是一个完整的、不可拆分的原子业务(注意这里是原子业务,而不是原子对象),即其意图是让这些算法独立,并且可以相互替换,让行为的变化独立于拥有行为的客户;而命令模式则是对动作的解耦,把一个动作的执行分为执行对象(接收者角色)、执行行为(命令角色),让两者相互独立而不相互影响。

我们从一个相同的业务需求出发,按照命令模式和策略模式分别设计出一套实现,来看看它们的侧重点有什么不同。zip和gzip文件格式相信大家都很熟悉,它们是两种不同的压缩格式,我们今天就来对一个目录或文件实现两种不同的压缩方式:zip压缩和gzip压缩(这里的压缩指的是压缩和解压缩两种对应的操作行为,下同)。

命令模式

详情请看之前的文章23种设计模式之命令模式

策略模式

详情请看之前的文章23种设计模式之策略模式

相同点

  • 封装变化。

  • 策略模式封装算法的变法,命令模式封装请求的变化。

  • 都使用组合来实现功能,达到解耦的目的。

  • 如果我们将命令模式做更高层次上的抽象,可以将它看成是一种策略模式。

    如:我们将Client与Invoker封装到一起,将Concrete Command与Receiver封装到一起。

总结

命令模式可以被抽象地视为一种策略模式,但是显然命令模式处理的是更为复杂的情况

  • 关注点不同

    策略模式关注的是算法替换的问题,一个新的算法投产,旧算法退休,或者提供多种算法由调用者自己选择使用,算法的自由更替是它实现的要点。换句话说,策略模式关注的是算法的完整性、封装性,只有具备了这两个条件才能保证其可以自由切换。

    命令模式则关注的是解耦问题,如何让请求者和执行者解耦是它需要首先解决的,解耦的要求就是把请求的内容封装为一个一个的命令,由接收者执行。由于封装成了命令,就同时可以对命令进行多种处理,例如撤销、记录等。

  • 角色功能不同

    在我们的例子中,策略模式中的抽象算法和具体算法与命令模式的接收者非常相似,但是它们的职责不同。策略模式中的具体算法是负责一个完整算法逻辑,它是不可再拆分的原子业务单元,一旦变更就是对算法整体的变更。

    而命令模式则不同,它关注命令的实现,也就是功能的实现。例如我们在分支中也提到接收者的变更问题,它只影响到命令族的变更,对请求者没有任何影响,从这方面来说,接收者对命令负责,而与请求者无关。命令模式中的接收者只要符合六大设计原则,完全不用关心它是否完成了一个具体逻辑,它的影响范围也仅仅是抽象命令和具体命令,对它的修改不会扩散到模式外的模块。

    当然,如果在命令模式中需要指定接收者,则需要考虑接收者的变化和封装,例如一个老顾客每次吃饭都点同一个厨师的饭菜,那就必须考虑接收者的抽象化问题。

  • 使用场景不同

    策略模式适用于算法要求变换的场景,而命令模式适用于解耦两个有紧耦合关系的对象场合或者多命令多撤销的场景。


这里。。。

23种设计模式之命令模式和策略模式的区别相关推荐

  1. C++23种设计模式(1)-工厂方法模式

    C++常用的设计模式有23种. 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享 ...

  2. 23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式。

    23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式. 1. 随处可见的模板模式 2. 暗含讲究的工厂方法模式 3. 单例模式隐含的坑你能看到第几层? 视频讲解如下,点击观看: [干货篇]23种 ...

  3. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  4. 23种设计模式(十四)模板方法模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  5. 23种设计模式(二十三)访问者模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  6. 23种设计模式【全】 包含:模式定义 使用场景 实现步骤 优缺点 模式区别 UML类图 示例代码 注意项等

    23种设计模式(全) ***项目地址***:[GitHub](https://github.com/yjhroot/design-pattern) 声明 模式分类(3大类) 创建型模式(共5种) 结构 ...

  7. Java两种设计模式_23种设计模式(11)java策略模式

    23种设计模式第四篇:java策略模式 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这 ...

  8. 23种设计模式之命令模式

    命令模式的定义 定义: 将一个请求封装成一个对象, 从而让你使用不同的请求将客户端参数化, 对请求排队或者记录请求日志, 可以提供命令的撤销和恢复功能 通俗的说, 就是当有不同的请求时, 将每一种请求 ...

  9. 23种设计模式(6):代理模式

    先看一个例子,是有关于打游戏杀怪兽的. //先定义一个游戏者接口 public interface IGamePlayer {//登陆游戏public void login(String user, ...

最新文章

  1. 黑白世界,感受不同的旅行...
  2. 干货 | 数万实例数百TB数据量,携程Redis治理演进之路
  3. 工作线程AfxBeginThread的使用
  4. 魔兽服务器联盟在线,《魔兽世界》怀旧服再开新服,部落联盟泾渭分明?
  5. Centos 7 RabbitMQ + Haproxy 集群高可用部署
  6. Android开发笔记(一百七十六)借助FileProvider发送彩信
  7. 4000多人全靠报表自动化,效率提高60%,这套数据平台方法论真强
  8. mySql学习笔记:比sql server书写要简单
  9. 将Excel数据导入mysql数据库的几种方法
  10. 中计算均方误差_为什么分类问题不使用均方误差作为代价函数
  11. 渗透测试基础-XSS漏洞简析
  12. 软件过程模型(详解)
  13. 重装ubuntu16.04之搜狗拼音输入法
  14. 误差反向传播(手把手教你推导如何通过反向传播更新参数)
  15. 获取Linux系统的网卡ip地址
  16. Arch Linux 天坑
  17. 龟背驼腰下一句更精彩
  18. 火车头采集ajax网址的技巧,使用post方法获得采集网址
  19. 德威控股在港交所招股书失效:2021年度利润大增,由杨时家族控股
  20. 如何“避雷”(化解风险)

热门文章

  1. 三菱PLC控制—天塔之光
  2. 《Java特种兵》5.2 线程安全(一)
  3. sessionFactory理解
  4. Android拦截短信的实现,英雄联盟手游新消息,安卓率先测试,ROG游戏手机5将提前上手?...
  5. 树莓派MJPG-Streamer输出MJPG格式的白屏问题
  6. Ubuntu将lib库加入到系统
  7. 食品营养成分检测有什么作用
  8. 驱动精灵升级后电脑卡死、连不上网
  9. 江苏扬州通报考古人员被打事件:两名城管队员已被拘
  10. 什么是RAID? RAID详解