Java 设计模式之命令模式
文章目录
- 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;
}
@Override
public void execute() {
light.turnOff();
}
}
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public 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);
}
@Override
void execute() {
receiver.bakeFish();
}
}
public class RoastMeatCommand extends Command {
public RoastMeatCommand(RoastCook receiver) {
super(receiver);
}
@Override
void 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();
}
}
输出:
下单:烤鱼
下单:烤鱼
下单:烤肉
下单:烤鱼
取消:烤鱼
烤鱼
烤肉
烤鱼