命令模式(Command)
2016-01-20 10:19
369 查看
命令模式(Command):将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式,顾名思义来理解即可,就是客户端发布一个命令(也就是“请求”),而这个命令是已经被封装成一个对象的。即这个命令对象的内部可能已经指定了该命令具体被谁负责执行。就像开发经理从客户那边获取对方的需求(命令),客户在描述具体的需求可以决定是否明确指出该需求的执行方。
命令模式的通用类图如下:
上图中,Invoker 类就相当于开发经理,ConcreteCommand 类是具体的命令,它继承自抽象命令类 Command 类,该抽象类中定义了每个命令被执行的方法 execute() 。Receiver 抽象类定义了对每一个具体的命令的执行方法 action() ,一旦接收到命令则立即行动。这里应该注意的是,每个具体的命令类都必须指定该命令的接收者,否则这命令发布了也没相应的人来完成,那就没戏了。
具体代码实现如下:
命令接收者相关类:
//抽象接收者,定义了每个接收者应该完成的业务逻辑
abstract class AbstractReceiver {
public abstract void doJob();
}
// 具体接收者01,实现自己真正的业务逻辑
class Receiver01 extends AbstractReceiver {
public void doJob() {
System.out.println("接收者01 完成工作 ...\n");
}
}
// 具体接收者02,实现自己真正的业务逻辑
class Receiver02 extends AbstractReceiver {
public void doJob() {
System.out.println("接收者02 完成工作 ...\n");
}
}
命令类:
// 抽象命令类,定义了每个具体命令被执行的入口方法execute()
abstract class AbstractCommand {
public abstract void execute();
}
// 具体命令类01,通过构造函数的参数决定了该命令由哪个接收者执行
class Command01 extends AbstsractCommand {
private AbstractReceiver receiver = null;
public Command01(AbstractReceiver receiver) {
this.receiver = receiver;
}
public void execute() {
System.out.println("命令01 被发布 ...");
this.receiver.doJob();
}
}
// 具体命令类02,通过构造函数的参数决定了该命令由哪个接收者执行
class Command02 extends AbstractCommand {
private AbstractReceiver receiver = null;
public Command02(AbstractReceiver receiver) {
this.receiver = receiver;
}
public void execute() {
System.out.println("命令02 被发布 ...");
this.receiver.doJob();
}
}
调用者类:
// 调用者,负责将具体的命令传送给具体的接收者
class Invoker {
private AbstractCommand command = null;
public void setCommand(AbstractCommand command) {
this.command = command;
}
public void action() {
this.command.execute();
}
}
测试类:
//测试类
public class Client {
public static void main(String[] args) {
// 创建调用者
Invoker invoker = new Invoker();
// 创建一个具体命令,并指定该命令被执行的具体接收者
AbstractCommand command01 = new Command01(new Receiver01());
// 给调用者发布一个具体命令
invoker.setCommand(command01);
// 调用者执行命令,其实是将其传送给具体的接收者并让其真正执行
invoker.action();
AbstractCommand command02 = new Command01(new Receiver02());
invoker.setCommand(command02);
invoker.action();
}
}
测试结果:
命令模式,顾名思义来理解即可,就是客户端发布一个命令(也就是“请求”),而这个命令是已经被封装成一个对象的。即这个命令对象的内部可能已经指定了该命令具体被谁负责执行。就像开发经理从客户那边获取对方的需求(命令),客户在描述具体的需求可以决定是否明确指出该需求的执行方。
命令模式的通用类图如下:
上图中,Invoker 类就相当于开发经理,ConcreteCommand 类是具体的命令,它继承自抽象命令类 Command 类,该抽象类中定义了每个命令被执行的方法 execute() 。Receiver 抽象类定义了对每一个具体的命令的执行方法 action() ,一旦接收到命令则立即行动。这里应该注意的是,每个具体的命令类都必须指定该命令的接收者,否则这命令发布了也没相应的人来完成,那就没戏了。
具体代码实现如下:
命令接收者相关类:
//抽象接收者,定义了每个接收者应该完成的业务逻辑
abstract class AbstractReceiver {
public abstract void doJob();
}
// 具体接收者01,实现自己真正的业务逻辑
class Receiver01 extends AbstractReceiver {
public void doJob() {
System.out.println("接收者01 完成工作 ...\n");
}
}
// 具体接收者02,实现自己真正的业务逻辑
class Receiver02 extends AbstractReceiver {
public void doJob() {
System.out.println("接收者02 完成工作 ...\n");
}
}
命令类:
// 抽象命令类,定义了每个具体命令被执行的入口方法execute()
abstract class AbstractCommand {
public abstract void execute();
}
// 具体命令类01,通过构造函数的参数决定了该命令由哪个接收者执行
class Command01 extends AbstsractCommand {
private AbstractReceiver receiver = null;
public Command01(AbstractReceiver receiver) {
this.receiver = receiver;
}
public void execute() {
System.out.println("命令01 被发布 ...");
this.receiver.doJob();
}
}
// 具体命令类02,通过构造函数的参数决定了该命令由哪个接收者执行
class Command02 extends AbstractCommand {
private AbstractReceiver receiver = null;
public Command02(AbstractReceiver receiver) {
this.receiver = receiver;
}
public void execute() {
System.out.println("命令02 被发布 ...");
this.receiver.doJob();
}
}
调用者类:
// 调用者,负责将具体的命令传送给具体的接收者
class Invoker {
private AbstractCommand command = null;
public void setCommand(AbstractCommand command) {
this.command = command;
}
public void action() {
this.command.execute();
}
}
测试类:
//测试类
public class Client {
public static void main(String[] args) {
// 创建调用者
Invoker invoker = new Invoker();
// 创建一个具体命令,并指定该命令被执行的具体接收者
AbstractCommand command01 = new Command01(new Receiver01());
// 给调用者发布一个具体命令
invoker.setCommand(command01);
// 调用者执行命令,其实是将其传送给具体的接收者并让其真正执行
invoker.action();
AbstractCommand command02 = new Command01(new Receiver02());
invoker.setCommand(command02);
invoker.action();
}
}
测试结果:
命令01 被发布 ... 接收者01 完成工作 ... 命令02 被发布 ... 接收者02 完成工作 ... |
相关文章推荐
- nginx与openssl的整合
- centos6.5配置本地yum源
- Linux下压缩文件夹
- Android34_跨进程访问AIDL
- Android33_Service
- TCP,UDP数据包的大小以及MTU
- 数据分析与挖掘
- SDWebImage内部实现过程
- 我的博客
- 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象
- golang中的race检测
- linux 下安装gult
- str操作
- python三大神器之一fabric使用
- linuxsort命令的使用详解
- Linux sendmail 日志 DSN:Service unavailable
- JS在遍历二维数组的时候会出现无限遍历,卡死的问题
- spark RDD
- Android32_ExpandableListView、AutoCompleteTextView、ToggleButton
- Learning Git(1)——概述