行为型模式(2)——命令模式

定义

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

假设现在有一个请求处理类(低层类/第三方类),如果客户端拿到这个类之后直接调用它,那么客户端和这个请求处理类之间的藕合度过高。这时候我们在客户端的请求发送类和请求处理类之间增加一个Invoker类,再将请求发送类发送的所有请求封装成对象,然后让Invoker类去管理这些请求对象,并决定这些请求是否允许执行、何时执行、按什么顺序执行。

由于在请求发送类和请求处理类之间增加了请求转发者,因此这两个类之间的藕合度就大大降低。

优点:

  1. 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
  2. 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,只需操作命令子类即可,它满足“开闭原则”,对扩展比较灵活。
  3. 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
  4. 通过在请求发送者和请求处理者之间增加转发类的方式,从而客户端发出的请求可以在被处理之前都存放在Invoker类的容器中,请求在被执行前就有了一个缓冲,命令模式可以与后面介绍的备忘录模式结合,能起到以下作用:

            a)Invoker能够对客户端发出的请求进行排序

            b)Invoker能够决定是否需要驳回请求

            c)客户端可以在请求被执行前选择撤销某个请求

            d)在需要的情况下,客户端的请求可以被记录成日志

缺点:

可能产生大量具体命令类。因为计对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性。

模式结构

  • Invoker类用于管理客户端想要发送的请求Command;
  • Invoker中有一个List<Command>,用于存放客户端发来的还没有被执行的请求;
  • 客户端通过Invoker类中的add、delete函数,向Invoker发送或删除请求;
  • 客户端通过Invoker类的executeCommand()函数,一次性执行Invoker中尚未被执行的请求。
  • 当客户端执行Invoker的executeCommand()函数时,该函数实际调用了当前Command对象肚子中的executeCommand()函数。
  • Command类中含有请求处理者Receiver的对象,客户端通过Command对象中的setReceiver(Receiver)函数来设置;
  • 当客户端调用Invoker的executeCommand()时,该函数调用了当前Command对象的executeCommand()函数,该函数再调用Command肚子中那个Receiver对象的具体处理函数。

客户端代码

main(){
	//创建Receiver对象
	Receiver receiver = new Receiver();
 
	//创建Command对象,并往Command肚子里设置该命令所要执行的处理类的对象
	Command commandA = new ConcreteCommandA();
	commandA.setReceiver(receiver);
 
	Command commandB = new ConcreteCommandB();
	commandB.setReceiver(receiver);
 
	//创建Invoker对象,并往它肚子里添加需要处理的命令
	Invoker invoker = new Invoker();
	invoker.add(commandA);
	invoker.add(commandB);
 
	//执行Invoker肚子里的所有命令
	invoker.executeCommand();
}

参考:

(1)三分钟理解“命令模式”——设计模式轻松掌握  https://blog.csdn.net/u010425776/article/details/48243053

(2)命令模式(详解版) http://c.biancheng.net/view/1380.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值