为什么命令模式?
我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种松耦合的方式来设计软件,使得请求发送者与请求接收者能够消除彼此之间的耦合,让对象之间的调用关系更加灵活,可以灵活地指定请求接收者以及被请求的操作。
命令模式角色
● Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。
● ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(Action)。
● Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。
● Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。
以下为命令模式简单的实现:
/**
* 调用者Invoke 和 Receiver接收者 通过Conmman 得到解耦
* Receiver 接收者执行与请求相关的操作,它具体实现对请求的业务处理
* Invoke 调用者即请求发送者,它通过命令对象来执行请求
* @author huang
*
*/
public class CommanTest {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Conmman conmman = new ConcreteCommand(receiver);
Invoke invoke = new Invoke(conmman);
invoke.action();
}
}
/**
* 实现具体业务
*/
class Receiver {
public void action(){
System.out.println("通过命令执行调用者的请求");
}
}
/**抽象模式
*/
interface Conmman{
void excute();
}
/**具体命令,实现抽象命令,并指定接收者,去执行具体的方法
*/
class ConcreteCommand implements Conmman{
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void excute() {
receiver.action();
}
}
/**
* 请求发送者,只需要只与抽象命令类之间存在关联关系,不用知道要发给谁
*/
class Invoke{
private Conmman conmman;
public Invoke(Conmman conmman){
this.conmman = conmman;
}
public void action(){
conmman.excute();
}
}
参考原文:https://blog.csdn.net/taozi8023/article/details/51452987
学习hystrix原理时,看到命令模式,想知道hystrix为什么要采用命令模式,所以记下笔记~
RPC
框架的一个远程接口所定义的方法可能不止一个,为了更加细粒度的保护单个方法调用,命令模式就非常适合这种场景。命令模式的本质就是分离方法调用和方法实现,通过将接口方法抽象成HystricCommand
的子类,从而获得安全防护能力,并使得的控制力度下沉到方法级别,参考文章:https://blog.csdn.net/liuxiao723846/article/details/79401325