命令模式
定义:将请求封装为对象,从而可以不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
作用
1.设计一个命令队列
2.记录日志
3.允许接收请求的一方否决请求
4.容易地实现对请求的撤销和重做
5.方便增加具体命令类,具体操作类
命令模式的实现需要三部分:命令部分,通知部分,执行部分。
命令部分对应不同的请求,执行部分对应不同的命令,通知部分对命令进行收集,排队,撤销,通知执行。
命令模式是为了解决请求与执行部分的紧耦合,这不方便对请求做记录,排队,操作。
实现
命令部分
/**
* @author 州牧
* @description 抽象命令类,定义命令类行为
* @since 2022-04-05 15:51
*/
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver = receiver;
}
public abstract void execute();
}
/**
* @author 州牧
* @description 具体的命令类
* @since 2022-04-05 15:54
*/
public class DemoCommand1 extends Command{
public DemoCommand1(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action();
}
}
操作部分
/**
* @author 州牧
* @description
* @since 2022-04-05 15:55
*/
public abstract class Receiver {
public abstract void action();
}
/**
* @author 州牧
* @description
* @since 2022-04-05 15:56
*/
public class DemoReceiver1 extends Receiver{
@Override
public void action() {
System.out.println("DemoReceiver1的行为");
}
}
通知部分
import java.util.ArrayList;
import java.util.List;
/**
* @author 州牧
* @description 增加命令,通知执行命令
* @since 2022-04-05 15:57
*/
public class DemoNotify {
/**一个命令的集合*/
private List<Command> list = new ArrayList<>();
/**增加命令*/
public void addCommand(Command command){
list.add(command);
}
/**执行*/
public void executeAll(){
for (Command command : list) {
command.execute();
}
}
}
执行效果
/**
* @author 州牧
* @description
* @since 2022-04-05 16:01
*/
public class Client {
public static void main(String[] args) {
DemoReceiver1 receiver = new DemoReceiver1();
DemoCommand1 command1 = new DemoCommand1(receiver);
DemoNotify notifier = new DemoNotify();
notifier.addCommand(command1);
notifier.executeAll();
}
}
/*
DemoReceiver1的行为
*/