命令模式场景:
当不同需求需要不同的实例进行执行,或者一个需求需要不同实例共同合作执行,但是需求者不太想和具体的实现者一一打交道,就可以把需求封装成一个命令,把命令传给一个执行者,执行者接到命令后,执行命令,并把具体的如何执行交给具体的命令本身。 具体的命令本身具体组合实际执行者,编排流程等。
命令模式是一个高内聚模式。
- Receiver : 具体的执行者
- Command : 需要执行的命令在此声明
- Invoker: 接到命令执行命令。
通用Receiver
public abstract class Receiver{
public abstract void doSomthing();
}
具体Receiver
public class ConcreteReceiver1{
@Override
public void doSomthing(){
//TODO
}
}
通用Command
public abstract class Command{
public abstract void execute();
}
具体Command
public class ConcreteCommand1{
private Receiver receiver;
public ConcreteCommand1(Receiver receiver){
this.receiver=receiver;
}
@Override
public void execute(){
this.receiver.doSomething();
}
}
Invoker
publ;ic class Invoker{
private Command command;
public void setCommand(Command command){
this.command=command;
}
public void action(){
this.command.execute();
}
}
public class Client {
public static void main(String[] args){
Invoker invoker=new Invoker();
Receiver receiver=new ConcreteReceiver();
Command command=new ConcreteCommand();
invoker.setCommand(command);
invoker.action();
}
}
命令模式的优点
- 类间解耦。 调用者和接受者之间没有依赖,通过调用Command的execute方法执行,不需要了解到底是哪一个接收者执行
- 可扩展性。 Command的子类易于扩展。Invoker和高层模块Client 没有严重的代码耦合。
- 命令模式结合责任链模式,结合模板模式可以组合设计更好的模式。
缺点
Command可能会膨胀。