命令模式

来源:互联网 发布:windows 10 ie崩溃 编辑:程序博客网 时间:2024/06/07 07:06

定义

在软件系统中,“行为请求者”与“行为实现者”通常是紧耦合,即行为请求者直接调用行为实现者。这种紧耦合情况下,如果要对行为进行:记录、撤销/重做、事务等处理,非常苦难,因为很可能需要修改实现者的代码。

通过传送命令的方式将行为请求者与行为实现者解耦,这就是命令模式。

类结构图


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是谁,

实例

电视机遥控器:电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。

0 0