android 源码设计模式之--命令模式(Command Pattern)
1 模式定义
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。就是对命令进行封装,将命令请求者和命令执行者的责任分离开来实现松耦合。
2 应用场景
系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
系统需要在不同的时间指定请求、将请求排队(如:线程池+工作队列)和执行请求。
系统需要支持命令的撤销(Undo)和恢复(Redo)操作(比如系统挂掉之后重启做一些恢复操作,还有数据库的事务等)。
系统需要将一组操作组合在一起,即支持宏命令
3 组成部分
抽象命令接口Command:定义所有具体命令类的抽象接口,声明执行的方法。
具体的命令对象ConcreteCommand:该类实现了Command接口,持有具体的接受者对象,完成具体的命令。
接受者对象Receiver:接受者对象,真正执行命令的对象。| 该类负责具体实施或执行一个请求,执行具体逻辑的角色。任何一个类都可以成为一个接收者,而在接收者类中封装具体操作逻辑的方法我们则称为行动方法。
传递命令对象Invoker(调用者):持有命令对象,要求命令对象执行请求。
客户端对象Client:创建具体命令的对象并且设置命令对象的接受者。
通俗说:调用者不直接调用接收者的方法,而是去调用Command的execute()。对于调用者来说,它不需要知道接收者是谁


4 场景说明
5代码实例:
//抽象的命令基类
public abstract class Command {
abstract void execute();
}
/**
*
* @author androidos.com
* 具体的命令类,执行不同的命令
*
*/
public class ConcreteCommand extends Command {
Receiver receiverObject;
@Override
void execute() {
// TODO Auto-generated method stub
receiverObject.doSomethings("ConcreteCommand");
}
void setCommandReceiver(Receiver receiver){
receiverObject = receiver;
}
}
/**
*
* @author androidos.com
* 具体的命令类,执行不同的命令
*
*/
public class ConcreteCommand2 extends Command {
Receiver receiverObject;
@Override
void execute() {
// TODO Auto-generated method stub
receiverObject.doSomethings("ConcreteCommand2");
}
void setCommandReceiver(Receiver receiver){
receiverObject = receiver;
}
}/**
*
* @author androdos.net
* 抽象以接收者基类
*
*/
public abstract class Receiver {
public abstract void doSomethings(String message);
}
public class Receiver1 extends Receiver {
@Override
public void doSomethings(String message) {
// TODO Auto-generated method stub
System.out.println("Receiver1 执行 "+message);
}
}
public class Receiver2 extends Receiver {
@Override
public void doSomethings(String message) {
// TODO Auto-generated method stub
System.out.println("Receiver2 执行 "+message);
}
}调用者
public class Invoker {
/**
* 调用者持用中间层命令类的对象
*/
Command mComandinstances;
public void setCommand(Command command){
mComandinstances = command;
}
public void startAction(){
if(null != mComandinstances) {
mComandinstances.execute();
}
}
}测试类
/**
*
* @author androidos.net
* 客户端测试类
*
*/
public class ClientTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//实例化调用者类
Invoker invoker = new Invoker();
//实例化具体接收类
Receiver receiver = new Receiver1();
//实例化具体命令类
ConcreteCommand command1 = new ConcreteCommand();
//指定具体命令command1的实际执行业务的具体接收者receiver
command1.setCommandReceiver(receiver);
invoker.setCommand(command1);
invoker.startAction();
Receiver receiver2 = new Receiver2();
ConcreteCommand2 command2 = new ConcreteCommand2();
command2.setCommandReceiver(receiver2);
invoker.setCommand(command2);
invoker.startAction();
}
}程序打印如下:

站在巨人的肩上 参考文献:
https://blog.csdn.net/wwh578867817/article/details/51533263
https://www.imooc.com/article/15444
https://blog.csdn.net/zhwyj1019/article/details/79758057








评论