设计模式--命令模式
2017-12-28 17:30
141 查看
Java工程源码
类图
定义
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
优点
- 类间解耦 调用者Invoker与接受者receiver之间没任何依赖关系,调用者不需要了解到底哪个接收者执行
- 可扩展性 command子类可非常容易的扩展
- 命令模式结合其他模式会更优秀 如结合责任链模式,模板方法模式
缺点
- N个命令,N个Command,容易造成类膨胀
使用场景
GUI中,按钮点击;触发-反馈机制
扩展
实际设计中,可以选择减少Client类和Receiver类的依赖关系
抽象命令类
具体命令类
抽象接收者
具体接收者
调用者类
场景类
运行结果
类图
定义
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
优点
- 类间解耦 调用者Invoker与接受者receiver之间没任何依赖关系,调用者不需要了解到底哪个接收者执行
- 可扩展性 command子类可非常容易的扩展
- 命令模式结合其他模式会更优秀 如结合责任链模式,模板方法模式
缺点
- N个命令,N个Command,容易造成类膨胀
使用场景
GUI中,按钮点击;触发-反馈机制
扩展
实际设计中,可以选择减少Client类和Receiver类的依赖关系
抽象命令类
public abstract class Command { /** * 每个命令类都必须有一个执行命令的方法 */ public abstract void execute(); }
具体命令类
public class ConcreteCommand extends Command { // 对哪个receiver进行命令处理 private Receiver receiver; /** * 命令构造函数,关联命令接收者 * * @param _receiver 命令接收者 */ public ConcreteCommand(Receiver _receiver) { receiver = _receiver; } /** * 命令执行函数 */ @Override public void execute() { // 执行命令动作 System.out.println("命令" + hashCode() + ":开始执行"); // 接收者处理命令 receiver.doSomething(); } }
抽象接收者
public abstract class Receiver { /** * 定义每个接受者都必须完成的业务 */ public abstract void doSomething(); }
具体接收者
public class ConcreteReceiver extends Receiver { @Override public void doSomething() { System.out.println("接收者" + hashCode() + ":执行命令"); } }
调用者类
public class Invoker { private Command command; /** * 设置命令 * * @param _command 命令 */ public void setCommand(Command _command) { this.command = _command; } /** * 执行命令动作 */ public void action() { this.command.execute(); } }
场景类
public class Client { public static void main(String[] args) { // 新建调用者类 Invoker invoker = new Invoker(); // 新建接收者类 Receiver receiver1 = new ConcreteReceiver(); Receiver receiver2 = new ConcreteReceiver(); // 新建命令类 Command command1 = new ConcreteCommand(receiver1); Command command2 = new ConcreteCommand(receiver1); Command command3 = new ConcreteCommand(receiver2); // 调用者设置命令 invoker.setCommand(command1); // 调用者执行命令 invoker.action(); invoker.setCommand(command2); invoker.action(); invoker.setCommand(command3); invoker.action(); } }
运行结果
命令1808253012:开始执行 接收者589431969:执行命令 命令1252169911:开始执行 接收者589431969:执行命令 命令2101973421:开始执行 接收者685325104:执行命令
相关文章推荐
- 设计模式——命令模式
- Java命令设计模式详解
- 【游戏设计模式】之二 论撤消重做、回放系统的优雅实现:命令模式
- 23种设计模式4--行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
- <Head First 设计模式>:命令模式:Command
- OOP设计模式[JAVA]——04命令模式
- IOS设计模式之四(备忘录模式,命令模式)
- 设计模式之命令模式
- 设计模式:命令模式(Command)
- Java设计模式之命令模式
- 设计模式笔记--命令模式
- 设计模式之命令模式(command)
- Java设计模式----命令模式(command)
- 设计模式之命令模式
- Java设计模式之命令模式
- 设计模式读书笔记之命令模式(Command Pattern)
- 设计模式之命令模式(卷十四)
- JAVA设计模式——命令模式
- java 设计模式之命令模式
- 设计模式之命令模式(Command)