命令模式(Command)
命令模式的核心思想是将命令的发送者与命令的执行者进行了解耦,方便对二者进行扩展
其中有几个比较重点的角色
1.Command 即命令的接口或者抽象,所有的命令由其扩展
2.Receiver 命令的接收者,执行者,它负责对由Command扩展出来的命令做出具体的执行操作
3.ConcreteCommand 译成中文为–具体命令,由Command扩展而来,定义某个具体的命令,内部持有一个recevier对象,将Command和Receiver连接起来,起到一个桥梁作用,将具体的命令交给对应的命令接收者进行处理
4.Invoker 即命令的发送者,命令模式的方法入口,内部持有Command对象
5.Client 通常来讲,还有一个client,但是个人觉得不太重要,它只是一个具体的调用者了
整个调用流程为 Invoker >Command(ConcreteCommand 为具体实现) >Receiver ,即由invoker发起命令,指定某个确定的命令,由命令将调用逻辑递交给具体的执行者。
UML
上代码
- 命令抽象
/**
* @author Xiaoyingge
* @description
* @date 2020/5/12 18:33
*/
public interface Command {
void execute ();
}
- 创建一个唤醒jarvis的命令
/**
* @author Xiaoyingge
* @description
* @date 2020/5/12 18:34
*/
public class WakeUpCommand implements Command {
private Jarvis jarvis;
public WakeUpCommand (Jarvis jarvis) {
this.jarvis = jarvis;
}
@Override
public void execute () {
System.out.println("命令已确认,将由jarvis执行");
jarvis.action();
}
}
- 创建执行人Jarvis
/**
* @author Xiaoyingge
* @description
* @date 2020/5/12 18:34
*/
public class Jarvis {
public void action () {
System.out.println("Hello ,Sir !");
}
}
- 钢铁侠随身带的迷你耳机
/**
* @author Xiaoyingge
* @description
* @date 2020/5/12 18:33
*/
public class Mic {
private Command command;
public Mic (Command command) {
this.command = command;
}
public void invoke () {
System.out.println("麦克风向远程服务器传输命令");
command.execute();
}
}
- 妮妮本妮
/**
* @author Xiaoyingge
* @description
* @date 2020/5/12 18:33
*/
public class TonyStark {
public static void main (String[] args) {
//创建命令的执行者
Jarvis jarvis = new Jarvis();
//创建一个唤醒命令,这个命令交给jarvis执行
Command command = new WakeUpCommand(jarvis);
//调用麦克风,把命令输入到麦克风里
Mic invoker = new Mic(command);
//麦克风唤醒远端的jarvis服务
invoker.invoke();
}
}
- 执行结果
原始定义 | 代码实现 |
---|---|
Command | Command |
Receiver | Jarvis |
ConcreteCommand | WakeUpCommand |
Invoker | Mic |
Client | TonyStark |