简介
命令模式是一种行为型模式。将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化。
角色
-
Command 一个具体命令的抽象接口。
-
ConcreteCommand 就是其具体的一个实现,你可以有多个Command接口的实现。具体命令本身并不实现具体的业务命令, 而是会将调用委派给一个业务逻辑对象去执行。
-
Receiver 作为具体命令的最终接收者。几乎任何对象都可以作为接收者,命令的细节由Receiver来实现。
-
Invoker 携带命令执行action请求。它不负责创建命令对象,它通常会通过构造函数从客户端处获得预先生成的命令。
使用
用电脑关机,关机,重启指令。
Command命令接口
public interface ICommand {
void execute();
}
具体命令接收者Receiver
public class Receiver {
public void shutdown(){
System.out.println("执行关机操作");
System.out.print("开始关机....");
}
public void restart(){
System.out.println("执行重启操作");
System.out.print("开始关机....");
System.out.print("开始开机....");
}
public void start(){
System.out.println("执行开机操作");
System.out.print("开始开机....");
}
}
实现命令子类ConcreteCommand
关机命令
public class ShutdownCommand implements ICommand{
private Receiver receiver;
public ShutdownCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("执行关机命令");
receiver.shutdown();
}
}
开机命令
public class StartCommand implements ICommand{
private Receiver receiver;
public StartCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("执行开机命令");
receiver.shutdown();
}
}
重启命令
public class RestartCommand implements ICommand{
private Receiver receiver;
public RestartCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("执行重启命令");
receiver.shutdown();
}
}
Invoker
public class Invoker {
private ICommand command;
public Invoker(ICommand command){
this.command = command;
}
public void action(){
System.out.println("调用命令");
command.execute();
}
}
测试
public class Demo {
public static void main(String[] args) {
//构建接收者
Receiver receiver = new Receiver();
//创建命令指令
ICommand startCommand = new StartCommand(receiver);
ICommand shutdownCommand = new ShutdownCommand(receiver);
ICommand restartCommand = new RestartCommand(receiver);
//创建命令对象构造请求者
Invoker invoker = new Invoker(startCommand);
invoker.action();
Invoker invoker1 = new Invoker(shutdownCommand);
invoker1.action();
Invoker invoker2 = new Invoker(restartCommand);
invoker2.action();
}
}
优缺点
优点
- 将请求调用者与请求接收者进行解耦
- 拓展性高
缺点
- 扩展命令会导致类的数量增加 , 增加了系统实现的复杂程度