在软件系统中,“行为请求者”与“行为实现者”通常是紧耦合,即行为请求者直接调用行为实现者。这种紧耦合情况下,如果要对行为进行:记录、撤销/重做、事务等处理,非常苦难,因为很可能需要修改实现者的代码。
通过传送命令的方式将行为请求者与行为实现者解耦,这就是命令模式。
Command:定义命令的接口,一般就是声明execute方法;
ConcreteCommand:命令接口的实现对象(命令对象),通常会有接收者,并用调用者的功能来完成命令要执行的操作;
Receiver:真正执行命令的对象;
Invoker:这是客户端真正出发命令并要求执行相应操作的地方,也就是说相当于使用命令对象的入口;这个对象负责持有命令对象,相当于一个中间服务器,负责接收和转发命令;
Client(Assembler):具体命令的创建者,并指定命令对象的接受者(Receiver),然后把创建的命令对象传给Invoker保存起来,这样真正的客户端调用invoker就可以执行指定命令了,并不是每次要执行某个命令都需要创建一个命令。另外,为了准确调用命令,在Invoker中每个命令应该是唯一的。和传统的客户端不同,因此理解为装配者可能更合适。
注意:命令模式中的解耦指的是Invoker和Receiver之间的解耦,而不是Client和Receiver之间的解耦。
1. Client创建命令,并指定命令执行者;
2. Client把命令传递给Invoker;Invoker把命令存储起来,因此可以重复使用,并不是每次执行某个命令都需要创建一个命令。为了准确调用,每个命令应该是唯一的
3. Invoker负责调用Command的execute方法,command调用Receiver的行为完成命令执行;
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
Invoker可以存储很多的命令对象,而不用关心Receiver是谁,
电视机遥控器:电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。
原文:http://blog.csdn.net/woxueliuyun/article/details/21010431