设计模式之命令设计模式
-
命令设计模式(Command Pattern)
- 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象,并把该命令传给相应的对象执行命令,属于行为型模式
- 命令模式是一种特殊的策略模式,体现的是多个策略执行的问题,而不是选择的问题
-
应用场景
- 只要你认为是命令的地方,就可以采用命令模式
- 日常每个界面、按钮、键盘事件操作都是命令设计模式
-
角色
-
抽象命令(Command):需要执行的所有命令都在这里声明
-
具体命令(ConcreteCommand):定义一个接收者和行为之间的弱耦合,实现execute()方法,负责调用接收者的相应操作,execute()方法通常叫做执行方法
-
接收者(Receiver):负责具体实施和执行一个请求,干活的角色,命令传递到这里是应该被执行的,实施和执行请求的方法叫做行动方法
-
请求者(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法
-
客户端(Client):创建一个具体命令,ConcreteCommand对象并确定其接收者
-
-
代码示例,以空调开、关、制冷为例
/** * 命令执行者:包含具体命令 */ class ConditionReceiver { public void on() { System.out.println("空调开启了"); } public void cool() { System.out.println("空调开始制冷"); } public void off() { System.out.println("空调关闭了"); } } /** * 抽象命令 */ interface Command { /** * 执行动作 */ void execute(); } /** * 具体命令:开机 */ class OnCommand implements Command { /** * 对哪个receiver进行命令处理 */ private ConditionReceiver receiver; public OnCommand(ConditionReceiver receiver) { this.receiver = receiver; } @Override public void execute() { System.out.println("OnCommand-->execute"); receiver.on(); } } /** * 具体命令:制冷 */ class CoolCommand implements Command { /** * 对哪个receiver进行命令处理 */ private ConditionReceiver receiver; public CoolCommand(ConditionReceiver receiver) { this.receiver = receiver; } @Override public void execute() { System.out.println("CoolCommand-->execute"); receiver.cool(); } } /** * 具体命令:关机 */ class OffCommand implements Command { /** * 对哪个receiver进行命令处理 */ private ConditionReceiver receiver; public OffCommand(ConditionReceiver receiver) { this.receiver = receiver; } @Override public void execute() { System.out.println("OffCommand-->execute"); receiver.off(); } } /** * 请求者 */ class AppInvoker { private Command onCommand; private Command coolCommand; private Command offCommand; public void setOnCommand(Command onCommand) { this.onCommand = onCommand; } public void setCoolCommand(Command coolCommand) { this.coolCommand = coolCommand; } public void setOffCommand(Command offCommand) { this.offCommand = offCommand; } /** * 开机 */ public void on() { onCommand.execute(); } /** * 制冷 */ public void cool() { coolCommand.execute(); } /** * 关机 */ public void off() { offCommand.execute(); } } public class Main { public static void main(String[] args) { // 创建接收者,空调就是接收者 ConditionReceiver receiver = new ConditionReceiver(); // 创建命令对象,设置命令的接收者 OnCommand onCommand = new OnCommand(receiver); CoolCommand coolCommand = new CoolCommand(receiver); OffCommand offCommand = new OffCommand(receiver); // 创建请求者,把命令对象设置进去,app就是请求发起者 AppInvoker appInvoker = new AppInvoker(); appInvoker.setOnCommand(onCommand); appInvoker.setCoolCommand(coolCommand); appInvoker.setOffCommand(offCommand); appInvoker.on(); appInvoker.cool(); appInvoker.off(); } }
-
优点
- 调用者角色与接收者角色之间没有任何依赖关系,不需要了解到底是哪个接收者执行,降低了系统耦合度
- 扩展性强,新的命令可以很容易添加到系统中去
-
缺点
- 过多的命令模式会导致某些系统有过多的具体命令类