命令模式
定义
Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式的示意图
代码实现
接收者
客户最终调用的角色
抽象接收者
1 2 3 4 5 6 7 8 9 package org.example.command;public abstract class Receiver { public abstract void receive () ; }
具体接收者
1 2 3 4 5 6 7 8 9 10 11 package org.example.command;public class ConcreteRecevier1 extends Receiver { @Override public void receive () { System.out.println("需要执行的命令需求" ); } }
命令
调用接收者
抽象命令
1 2 3 4 5 6 7 8 package org.example.command;public abstract class Command { public abstract void execute () ; }
具体命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package org.example.command;public class ConcreteCommand1 extends Command { private Receiver receiver ; public ConcreteCommand1 (Receiver receiver) { this .receiver = receiver ; } @Override public void execute () { this .receiver.receive(); } }
调用者
调用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package org.example.command;public class Invoker { private Command command ; public void setCommand (Command command) { this .command = command ; } public void action () { this .command.execute(); } }
场景实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class App { public static void main (String[] args) { Receiver receiver = new ConcreteRecevier1(); Command command = new ConcreteCommand1(receiver); Invoker invoker = new Invoker(); invoker.setCommand(command); invoker.action(); } }
应用场景
在gui开发中可以采用命令模式。一个按钮点击就是一个命令。
模拟dos和shell命令也可以采用命令模式。
命令模式的优缺点
优点
类间解耦。各个角色之间没有依赖关系。
可扩展性强,命令和接收者都可以扩展。
命令模式可以与其他模式结合使用。比如结合责任链模式实现命令族解析,结合模板方法模式减少类膨胀问题。
缺点
有类膨胀问题。命令和接收者虽然可以无限扩展,但会出现类膨胀。