首先,我们得清楚为何要解耦?

  耦合的坏处就是,牵一发而动全身,比如,当我更改了类A或其子类的时候,类B也要进行修改。这里,解除耦合,就意味着,即使你Receiver怎么改,添加了多少,删除了多少。我Invoker都不需要做什么改动。

有人会说,这不是很好办吗,我定义一个接口,每个Receiver都实现这个接口,然后我Invoker针对这个接口编程不就好了?

  这样有两个问题,一方面,我可能需要根据Receivier的方法或特性进行多种操作,一个接口实现是不能够满足需求的。
另一方面,如果有些Receiver已经存在,如果要让它实现一个接口,那不是就要修改原来的代码吗,这是要尽量避免的。
注意:Receiver可以是任何一个类。我们的目的就是要无修改地利用现有类。让Invoker根据需要,利用现有类的部分功能。
 
 
命令模式如何实现解耦?
  Invoker同样是针对接口编程,不过这个接口并不是由Receiver实现,而是由命令对象实现。Invoker只管调用命令对象的execute方法即可,它根本不知道execute方法里发生了什么。命令对象就是Invoker和Receiver之间沟通的桥梁。利用命令对象,我们可以根据需要使Invoker调用某个类的某个方法等。
 
有人就奇怪了,要操作一个Receiver的某个方法,直接调用不就好了,为什么还要封装一下,专门给Invoker调用,这么麻烦?
  很多学习命令模式的,刚接触的案例都是那几个。直接调用,和让Invoker调用,输出也没什么差别。所以,很多人没有意识到,命令给谁做的差别。但是,设想一下,如果这个命令是交给一个线程呢?这就不一样了吧。
  如果不是直接调用,而是给其他类调用,那么这个调用类就必须知道该如何操作这个被调用的类(Receiver),而命令对象,就告诉了它,"别怕,你只要执行我的execute方法就好了,其他细节我来处理。"

【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver的更多相关文章

  1. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  2. 『学了就忘』vim编辑器基础 — 95、命令模式中的相关命令

    目录 1.移动光标操作 2.删除或剪切操作 3.复制操作 4.撤销操作 5.替换操作 6.补充一个知识点 命令模式中的命令主要取代的是Linux系统中鼠标的操作. vim编辑器的快捷键一般都集中在命令 ...

  3. 下面的那一个不属于MVC模式中的对象?

    下面的那一个不属于MVC模式中的对象? A. Model B. View C. Collection D. Controller 解答:C MVC是三个单词的缩写,分别为: 模型(Model),视图( ...

  4. JavaScript设计模式之命令模式【命令解耦】

    在讲解命令模式之前我们先来了解一个生活中的命令模式场景: 场景1: 医院看病抓药: 当你因为肾虚到医院看医生,医生一番操作之后得出结论:要吃个疗程[夏桑菊].[小柴胡](药名纯属虚构,真的肾虚就找医生 ...

  5. 设计模式--命令模式Command(对象行为型)

    一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...

  6. (十三)WebGIS中工具栏的设计之命令模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 从这一章节开始我们将正式进入WebGIS的工具栏中相关功能的 ...

  7. java设计模式之命令模式以及在java中作用

    命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请 ...

  8. 设计模式学习笔记(十五)命令模式及在Spring JdbcTemplate 中的实现

    命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储.传递.调用.增加与管理. 也就是将发送者.接收者和调用命令封装成独立的对象,来供客户端调 ...

  9. Java设计模式 之 命令模式

    1      从属模式分类 行为性模式 2      命令模式意图 命令模式可将动作的请求者和动作的执行者对象中解耦. 该模式将一个行为操作发起者的请求封装到对象中,该请求由另外一个对象执行. 将动作 ...

随机推荐

  1. MVC图片验证

    1.创建一个验证类,里面有生成验证码的两个方法. namespace YTJWGL_Common { public class ValidatorCodeTools { #region 生成校验码图片 ...

  2. Windows 7 系统中开启 ASP.NET State Service 服务的方法

    控制面板 -> 程序和功能 -> “打开或者关闭 Windows 功能”对话框 -> Internet 信息服务 -> 万维网服务 -> 应用程序开发功能 -> A ...

  3. mysql命令行客户端结果分页浏览

    转载请注明出处:http://xiezhenye.com/2008/06/mysql%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%ae%a2%e6%88%b7%e7%ab%af%e7% ...

  4. .Net 持续集成 —— windows service

    上一篇讲了 Jenkins+WebDeploy+IIS完成 web项目部署,这篇继续讲windows service的部署. windows service 一般用于自动任务,定时完成某些操作.本文自 ...

  5. ASP.NET判断是否为手机登录

    protected void Page_Load(object sender, EventArgs e) { MobileHandle(); } 页面加载时候判断是否为手机登录 protected v ...

  6. jQuery的addClass,removeClass和toggleClass方法

    jQuery的addClass,removeClass和toggleClass方法,最后一个方法在某一情形之下,可以替代前面2个方法. 第一个方法addClass为元素添加一个class. 第二个方法 ...

  7. 小猴打架(luogu4430)(数论+生成树计数)

    一开始森林里面有\(N\)只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过\(N-1\)次打架之后,整个森林的小猴 ...

  8. 13_python_内置函数

  9. Atom 清空残余数据

    rm -rf ~/.atom rm /usr/local/bin/atom rm /usr/local/bin/apm rm ~/Library/Preferences/com.github.atom ...

  10. C# byte array 跟 string 互转

    用 System.Text.Encoding.Default.GetString() 转换时,byte array 中大于 127 的数据转 string 时会出问题. 把这里的 Default 换成 ...