目录
命令模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开,解耦合。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。
命令模式的本质是对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。
注:命令模式无法解决类的个数增加的问题

Command: 命令。定义命令的接口,声明执行的方法。
Receiver: 命令接收者,也就是命令真正的执行者。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker: 通过它来调用命令。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
Client: 可以设置命令与命令的接收者。
设计一个遥控器,可以控制电灯开关。

- public interface Command {
- void execute();
- }
-
- public class LightOnCommand implements Command {
- Light light;
-
- public LightOnCommand(Light light) {
- this.light = light;
- }
-
- @Override
- public void execute() {
- light.on();
- }
- }
-
- public class LightOffCommand implements Command {
- Light light;
-
- public LightOffCommand(Light light) {
- this.light = light;
- }
-
- @Override
- public void execute() {
- light.off();
- }
- }
- public class Light {
- public void on() {
- System.out.println("Light is on!");
- }
-
- public void off() {
- System.out.println("Light is off!");
- }
- }
- /**
- * 遥控器
- */
- public class Invoker {
- private Command[] onCommands;
- private Command[] offCommands;
- private final int slotNum = 7;
-
- public Invoker() {
- this.onCommands = new Command[slotNum];
- this.offCommands = new Command[slotNum];
- }
-
- public void setOnCommand(Command command, int slot) {
- onCommands[slot] = command;
- }
-
- public void setOffCommand(Command command, int slot) {
- offCommands[slot] = command;
- }
-
- public void onButtonWasPushed(int slot) {
- onCommands[slot].execute();
- }
-
- public void offButtonWasPushed(int slot) {
- offCommands[slot].execute();
- }
- }
- public class Client {
- public static void main(String[] args) {
- Invoker invoker = new Invoker();
- Light light = new Light();
- Command lightOnCommand = new LightOnCommand(light);
- Command lightOffCommand = new LightOffCommand(light);
- invoker.setOnCommand(lightOnCommand, 0);
- invoker.setOffCommand(lightOffCommand, 0);
- invoker.onButtonWasPushed(0);
- invoker.offButtonWasPushed(0);
- }
- }
优点
1. 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
2. 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
3. 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
4. 方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。
缺点
1. 使用命令模式可能会导致某些系统有过多的具体命令类。
2. 系统结构更加复杂。
JDK中的命令模式
java.lang.Runnable
javax.swing.Action