文章目录
- Java 设计模式之命令模式
- 概述
- UML
- 代码实现
- 简单实现
- 复杂实现
Java 设计模式之命令模式
概述
- 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
- 敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。
UML
- Command:命令接口,定义执行操作的通用接口。
- ConcreteCommand:具体命令类,实现具体的命令操作,持有接受者对象。
- Receiver:接收者累,实际执行操作的对象。
- Invoker:调用者,触发命令的对象。
代码实现
简单实现
定义命令接口:
public interface Command {void execute();
}
定义具体命令类:
public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}
定义接收者类:
public class Light {public void turnOn() {System.out.println("开灯");}public void turnOff() {System.out.println("关灯");}
}
定义调用者类:
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}
使用:
public class Client {public static void main(String[] args) {Light light = new Light();Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);RemoteControl control = new RemoteControl();control.setCommand(lightOn);control.pressButton();control.setCommand(lightOff);control.pressButton();}
}
输出:
开灯
关灯
复杂实现
定义抽象命令类:
abstract class Command {protected RoastCook receiver;public Command(RoastCook receiver) {this.receiver = receiver;}abstract void execute();
}
定义接收者类:
public class RoastCook {public void bakeMeet() {System.out.println("烤肉");}public void bakeFish() {System.out.println("烤鱼");}
}
定义具体命令类:
public class RoastFishCommand extends Command {public RoastFishCommand(RoastCook receiver) {super(receiver);}@Overridevoid execute() {receiver.bakeFish();}
}
public class RoastMeatCommand extends Command {public RoastMeatCommand(RoastCook receiver) {super(receiver);}@Overridevoid execute() {receiver.bakeMeet();}
}
定义调用者类:
public class Waiter {private ArrayList<Command> orders = new ArrayList<>();private Command command;// 下单public void setOrder(Command command) {String className = command.getClass().getSimpleName();if (className.equals("RoastFishCommand")) {System.out.println("下单:" + "烤鱼");} else {System.out.println("下单:" + "烤肉");}orders.add(command);}// 取消订单public void cancelOrder(Command command) {String className = command.getClass().getSimpleName();if (className.equals("RoastFishCommand")) {System.out.println("取消:" + "烤鱼");} else {System.out.println("取消:" + "烤肉");}orders.remove(command);}// 通知public void notifyCommand() {for (Command command : orders) {command.execute();}}
}
使用:
public class Client {public static void main(String[] args) {RoastCook receiver = new RoastCook();Command roastMeatCommand = new RoastMeatCommand(receiver);Command roastFishCommand1 = new RoastFishCommand(receiver);Command roastFishCommand2 = new RoastFishCommand(receiver);Command roastFishCommand3 = new RoastFishCommand(receiver);Waiter waiter = new Waiter();waiter.setOrder(roastFishCommand1);waiter.setOrder(roastFishCommand2);waiter.setOrder(roastMeatCommand);waiter.setOrder(roastFishCommand3);waiter.cancelOrder(roastFishCommand2);waiter.notifyCommand();}
}
输出:
下单:烤鱼
下单:烤鱼
下单:烤肉
下单:烤鱼
取消:烤鱼
烤鱼
烤肉
烤鱼