概念:命令模式可以将请求发送者和请求接收者完全解耦,发送者和接收者之间没有直接的引用关系,发送请求的对象,只需要知道如何发送请求,而不必知道如何发送请求。它是通过将一个请求封装成为一个命令对象,我们可以用不同的请求参数对请求发送者进行参数化,支持请求排队,请求撤销等等。
角色:
Commad :一般是一个抽象类或者一个接口,其中声明了用于执行请求的execute()方法,通过这些方法,可以调用请求接收者的相关操作。
ConcreteCommad:是抽象命令类的子类,实现了execute()方法,它关联了具体的接收者对象,在执行execute()方法时,将执行接收者对象的相关操作。
invoker:请求发送者,它通过命令执行请求,一个调用者并不需要再设计时确定请求接收者,它只与抽象命令进行关联。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。
Receiver:接收者执行与请求相关的操作,它具体实现对请求的业务处理。
Paste_Image.png
命令队列的实现:当发送一个请求时,可能不止一个请求接收者接收请求产生响应,这时我们需要一个请求对列来使请求接收者逐个完成请求响应,这可以铜鼓命令队列实现。
优点:
降低系统的耦合度,由于请求发送者和请求接收者,不存在直接的联系,相同的请求者发送者可以有不同的请求接收者,相同的请求接收者和可以接收不同的请求发送者发送的请求,两者具有独立性。
新的命令可以很容易地加入到系统中**。由于增加新的具体命令类不会影响到其他类,因此增加新的具体命令类很容易,无须修改原有系统源代码,甚至客户类代码,满足“开闭原则”的要求。
缺点:
会引入过多的命令类
Paste_Image.png
Android中的应用:
Paste_Image.png
new Thread(new Runnable(){
@override
public void run(){
}
}).start()
Thread:Invoker,请求调用者。start(call())->start0()->会调用Runnable的run()(execute())。
Runnable:Command,接口,抽象命令类。
匿名Runnable:ConcreteCommand,具体命令类。