命令模式(Command):
1.概念: 将“请求”(命令/口令)封装成一个对象,以便使用不同的请求、队列或者日志来参数化其对象。命令模式也支持撤销操作。命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开。
2.结构图:
组成成员:
1>、Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。
2>、ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的命令接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(operation)。
3>、Invoker(命令发起者/消息请求者):与抽象命令类存在关联关系,在命令发起时 将一个具体命令对象注入其中 再调用具体命令对象的执行方法(execute) 从而间接实现调用请求接收者的相关操作。
4>、Receiver(命令/消息 接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理(operation方法执行)。
3.应用场景:
点餐、遥控器、
4.实例(遥控器)
1、抽象命令类
public interface Command {
public void execute();
public void undo();
}
2.具体命令类
(开灯)
public class LightOnCommand implements Command {
private Light light;
LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
} public void undo() {
light.off();
}
}
(2)开电视
public class TVOnCommand implements Command {
private TV tv;
public TVOnCommand(TV tv) {
this.tv = tv;
}
public void execute() {
tv.on();
} public void undo() {
tv.off();
}
}
3.电器接口类
public interface HouseholdAppliances {
public void on();
public void off();
}
4.具体电器类
(1)电视
public class TV implements HouseholdAppliances {
public void on() {
System.out.println("the TV on");
}
public void off() {
System.out.println("the TV off");
}
}
(2)电灯
public class Light implements HouseholdAppliances{
public void on() {
System.out.println("the light on");
}
public void off() {
System.out.println("the light off");
}
}
总结:
优点:
命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开
容易实现撤销和重做、记录日志
命令类容易扩展(添加新命令不影响其他类)、修改
缺点:
使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。