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
评论