Java设计模式之命令模式
- 软件开发
- 2025-09-03 10:30:02

文章目录 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 mand = 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(); } }输出:
下单:烤鱼 下单:烤鱼 下单:烤肉 下单:烤鱼 取消:烤鱼 烤鱼 烤肉 烤鱼Java设计模式之命令模式由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Java设计模式之命令模式”