赞
踩
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。
是一种行为型模式。
目录
1、将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。2、可以在 根据请求执行命令的类 里、设计一个命令队列,把 声明接收者执行哪些命令的类 保存起来;3、允许接受请求的一方拒绝请求。
其中 ConcreteCommandA 和 ConcreteCommandB 是达到 此模式的目标功能 的重要载体。它把每次的请求都包装到自己独立的实例对象中,也就是说一个ConcreteCommand实例对象包括了一次请求的详细信息,那么我们通过这个对象保存的信息,就能够实现撤销、排队、拒绝等一系列需求了。
- Command---声明接收者执行哪些命令的类:声明接收者执行哪些命令的类的抽象类和接口 + 声明接收者执行哪些命令的类 ,调用接收者相应操作,以实现请求
- Invoker---根据请求执行命令的类:要求Command执行请求
- Receiver---接收者:有所有请求或命令相关的操作
- 请求发起者:创建一个具体命令对象并设定他的接收者,然后发起请求
- 抽象出待执行的动作以参数化某对象。参数化的用处如:回调(先将函数在某处注册,而他在稍后的某个时间运行)。
- 在不同时刻指定、排列和执行请求
- 支持取消操作
- 支持修改日志
- 用构建在原语操作上的高层操作构造一个系统
现有两个操作A和B,刚好对应两个请求A和B。这个例子比较简单,不能直观体验到命令模式带来的好处,比如他的功能有:取消请求、给请求排队、记录请求等,这些我暂时不分别演示了。但你可以把本例当做一个模板,然后灵活使用:
声明接收者执行哪些命令的类:
- //声明接收者执行哪些命令的类
- abstract class Command {
- protected Receiver receiver;
-
- public Command(Receiver receiver) {
- this.receiver = receiver;
- }
-
- public abstract void executeCommand();
- }
声明接收者执行哪些命令的类A:
- public class ConcreteCommandA extends Command {
- public ConcreteCommandA(Receiver receiver) {
- super(receiver);
- }
-
- @Override
- public void executeCommand() {
- System.out.println("对请求A的响应");
- this.receiver.actionA();
- }
- }
声明接收者执行哪些命令的类B:
- public class ConcreteCommandB extends Command {
- public ConcreteCommandB(Receiver receiver) {
- super(receiver);
- }
-
- @Override
- public void executeCommand() {
- System.out.println("对请求B的响应");
- this.receiver.actionB();
- }
- }
根据请求执行命令的类:
- //根据请求执行命令的类
- public class Invoker {
- private Command command;
-
- public void setCommand(Command command) {
- this.command = command;
- }
-
- public void executeCommand() {
- command.executeCommand();
- }
- }
接收者:
- //接收者
- public class Receiver {
- public void actionA() {
- System.out.println("接收者执行A!");
- }
- public void actionB() {
- System.out.println("接收者执行B!");
- }
- }
主程序(发起请求的类):
- public class Main {
- public static void main(String[] args) {
- Receiver receiver = new Receiver();
- Invoker invoker = new Invoker();
-
-
- invoker.setCommand(new ConcreteCommandA(receiver));//填装
- invoker.executeCommand();//发出命令A
-
-
- invoker.setCommand(new ConcreteCommandB(receiver));//填装
- invoker.executeCommand();//发出命令B
- }
- }
这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。
如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。