命令模式.
定义
将一个请求封装成一个对象,使发请求的责任和处理请求的责任分隔开,这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加和管理。
架构
抽象命令类:声明执行命令的接口,拥有执行命令的抽象方法(接口中声明一个执行命令的方法);
具体命令类:抽象命令类的具体实现类,拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作(注入命令接收者对象,调用接收者对象的方法);
实现者/接收者:执行命令功能的相关操作,是具体命令对象业务的真正实现者(最终要调用的是这个角色中的方法);
调用者/请求者:是请求的发送者,通常拥有很多命令对象,并通过访问命令对象来执行相关的请求,不直接访问接收者(注入抽象命令对象,调用抽象命令对象的方法,在使用的时候传入实现了抽象命令类的具体命令对象)
应用场景
1、请求调用者需要于请求接收者解耦时,命令模式可以使调用者和接收者不直接交互;
2、系统随机请求命令或者经常增加、删除命令时;
3、当系统需要执行一组操作时,命令模式可以定义宏命令来实现;
4、当系统需要支持命令的撤销操作和恢复操作时可以将命令对象存储起来,采用备忘录模式来实现。
代码

Command
/**抽象命令类,一个方法就是一个命令*/
public interface Command {
void excute();
}
ConcreteCommand
/**
*
* Description:
* 具体命令(遥控器按键)
* @author: mushi
* @Date: 2021/2/20 13:57
*/
public class ConcreteCommand implements Command{
/**该命令的具体执行者*/
private Receiver receiver;
public ConcreteCommand() {
receiver = new Receiver();
}
/**命令对应的处理方法*/
@Override
public void excute() {
receiver.action();
}
}
Receiver
/**
*
* Description:
* 接收者(处理命令)
* @author: mushi
* @Date: 2021/2/20 13:59
*/
public class Receiver {
/**根据命令执行相应操作,处理命令*/
public void action(){
System.out.println("接收到命令,开始执行操作");
}
}
Requester
/**
*
* Description:
* 请求者
* @author: mushi
* @Date: 2021/2/20 14:03
*/
public class Requester {
private Command command;
/**发送命令*/
public void sendCommand(){
command.excute();
}
public Requester(Command command) {
this.command = command;
}
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
}
Test
/**
*
* Description:
*
* @author: mushi
* @Date: 2021/2/20 14:07
*/
public class Test {
public static void main(String[] args) {
//具体命令
Command command = new ConcreteCommand();
//命令请求者发送命令
Requester requester = new Requester(command);
requester.sendCommand();
}
}
总结
可以按照遥控器控制电视来理解命令模式,
遥控器(命令发送者)通过按钮(具体命令)来遥控电视(命令接收者)
理解:将命令封装成对象,调用者将命令对象传递给实现者,实现者根据命令对象进行具体业务处理,相当于事先定义好规则,在接收到请求的时候进行调用,一条命令对应一个实现者;

浙公网安备 33010602011771号