android 源码设计模式之--命令模式(Command Pattern)

sancaiodm Android应用 2021-10-13 1484 0

1 模式定义

        将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。就是对命令进行封装,将命令请求者和命令执行者的责任分离开来实现松耦合。

2 应用场景


  1.  系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

  2.  系统需要在不同的时间指定请求、将请求排队(如:线程池+工作队列)和执行请求。

  3.  系统需要支持命令的撤销(Undo)和恢复(Redo)操作(比如系统挂掉之后重启做一些恢复操作,还有数据库的事务等)。     

  4.  系统需要将一组操作组合在一起,即支持宏命令

3 组成部分


  1. 抽象命令接口Command:定义所有具体命令类的抽象接口,声明执行的方法。

  2. 具体的命令对象ConcreteCommand:该类实现了Command接口,持有具体的接受者对象,完成具体的命令。

  3. 接受者对象Receiver:接受者对象,真正执行命令的对象。| 该类负责具体实施或执行一个请求,执行具体逻辑的角色。任何一个类都可以成为一个接收者,而在接收者类中封装具体操作逻辑的方法我们则称为行动方法。

  4. 传递命令对象Invoker(调用者):持有命令对象,要求命令对象执行请求。

  5. 客户端对象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();
	}
}

程序打印如下:

image.png


站在巨人的肩上 参考文献:

https://blog.csdn.net/wwh578867817/article/details/51533263

https://www.imooc.com/article/15444

https://blog.csdn.net/zhwyj1019/article/details/79758057


评论