胡思乱想命令模式中,命令对象如何解耦invoker和receiver

longfurcat longfurcat     2023-01-12     562

关键词:

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

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

 

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

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

命令模式(代码片段)

  命令模式定义:在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,... 查看详情

《设计模式》命令模式(代码片段)

《设计模式》命令模式命令模式(CommandPattern)是一种行为型设计模式,它将请求和处理分开,使得请求发送者和接收者解耦,从而降低系统的耦合度。在命令模式中,请求被封装为一个独立的对象,... 查看详情

设计模式——命令模式(代码片段)

...对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,... 查看详情

命令模式(代码片段)

命令模式旨在将"行为请求者"与"行为实现者"解耦如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。 关键代码:定义三个角色:1、received真正的命令执行对象2、Command3、invoker使用命令对象的入... 查看详情

headfirst设计模式--命令模式(代码片段)

模式定义命令模式(CommandPattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或... 查看详情

设计模式@第17章:命令模式(代码片段)

第17章:命令模式一、智能生活项目需求?看一个具体的需求我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。这些智能家电来自不同的厂家,我们不想针对每一种家... 查看详情

设计模式(11)-----命令设计模式

把命令封装成一个命令对象,使请求者和被请求者完全解耦。我们先来看一下类图: 下面我们来看代码 Invoker==SimpleRemoteControl public classSimpleRemoteControl     Commandslot;//有一个插槽持有命令,而这个命令控制着设... 查看详情

命令模式(代码片段)

/***命令模式:将方法的请求者跟方法的实现者进行分开,常见的例子:遥控器(命令发送者Invoker)通过按钮(具体的命令Command)来操作电视机(Receiver命令接收者或者说是命令实现者)*这样做的话,方法的请求者(遥控器)跟实现者(电视机)就... 查看详情

大话设计模式读书笔记--18.命令模式

定义命令模式定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作比如:吃烤串时,客人点烤羊肉,烤鸡肉,服务员记录下客人的点餐记录,然后通知厨师开始... 查看详情

设计模式——命令模式

...支持可撤销的操作。二、UML示意图  Command是一个命令抽象类,定义了Excute抽象方法,具体命令类持有一个接受者Receiver对象,并实现Excute方法根据不同的命令执行Receiver对象不同的方法。Invoker可以接受客户端发出的命令,... 查看详情

蛋疼的命令模式。(转)

还是简单的记录一下自己的理解。命令模式下,invoker于最后提供实现的对象receiver没有直接接触。invoker执行一个命令(方法),方法就是执行command对象里面的方法,该command对象里面包含了receiver对象。invoker就执行了一个命令,... 查看详情

命令模式——headfirst设计模式学习笔记

命令模式:将“请求”封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。 设计原则:把方法的调用封装起来,调用此对象不需要知道它内部具体是如何运行的,只需要知道包装... 查看详情

设计模式-命令模式详解及其在jdbctemplate中的应用(代码片段)

...程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。命令模式(CommandPattern)可以对发送者和接收者完全解耦,发送者... 查看详情

命令模式--设计模式(代码片段)

...方法的请求者与方法的实现者解耦?”变得很重要,命令模式能很好地解决这个问题。在现实生活中,这样的例子也很多,例如,电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者),还有计算... 查看详情

6命令模式(代码片段)

命令模式定义:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式将发出请求的对象(RemoteControl遥控器类)和执行请求的对象(点灯类)解耦;在被解耦的对象之间通过Command对象进行沟... 查看详情

命令模式

...定义将“请求”封装成对象,以便使用不同的请求命令模式解决了应用程序中对象的职责以及它们之间的通信方式。(发送者和接收者完全解耦)类型:行为型 二、适用场景1、请求调用者和请求接收者需要解耦,使得... 查看详情

设计模式学习之命令模式

...程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。命令模式可以对发送者和接收者完全解耦,发送者与接收者之... 查看详情

命令模式

命令模式命令模式是一个高内聚的模式,将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式的通用类图如下: Receiver接收者角... 查看详情