19-命令模式
19-命令模式
概念
命令模式(Command),将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
命令模式作用
第一:能比较容易地设计一个命令队列
第二:在需要的情况下,可以较容易地将命令记入日志
第三:允许接收请求的一方决定是否要否决请求
第四:可以容易地实现对请求的撤销和重做
第五:由于加新的命令不影响其他的类,因此增加新的命令很容易
最关键的一点:命令模式把请求一个操作的对象与怎么执行一个操作的对象分割开
例子
烤肉的例子
package com.gof.command;
/**
* 功能描述
*
* @since 2023-02-28
*/
public abstract class Command {
protected Barbecuer receiver;
public Command(Barbecuer receiver) {
this.receiver = receiver;
}
public abstract void executeCommand();
}
package com.gof.command;
/**
* 功能描述
*
* @since 2023-02-28
*/
public class BakeChickenWingCommand extends Command {
public BakeChickenWingCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void executeCommand() {
receiver.bakeChickenWing();
}
}
package com.gof.command;
/**
* 功能描述
*
* @since 2023-02-28
*/
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void executeCommand() {
receiver.bakeMutton();
}
}
package com.gof.command;
/**
* 功能描述
*
* @since 2023-02-28
*/
public class Barbecuer {
public void bakeMutton() {
System.out.println("烤羊肉串!");
}
public void bakeChickenWing() {
System.out.println("烤鸡翅!");
}
}
package com.gof.command;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* 功能描述
*
* @since 2023-02-28
*/
public class Waiter {
private List<Command> commands = new ArrayList<>();
public void addCommand(Command command) {
commands.add(command);
System.out.printf("增加订单:%s, 时间:%s \n", command.toString(), LocalDateTime.now());
}
public void cancelCommand(Command command) {
commands.remove(command);
System.out.printf("增加订单:%s, 时间:%s\n", command.toString(), LocalDateTime.now());
}
public void notifyExecute() {
for (Command command : commands) {
command.executeCommand();
}
}
}
package com.gof.command;
/**
* 功能描述
*
* @since 2023-02-28
*/
public class Client {
public static void main(String[] args) {
// 开业前 烤肉师傅准备,烤羊肉串菜单准备,烤鸡翅菜单准备
Barbecuer barbecuer = new Barbecuer();
BakeMuttonCommand muttonCommand = new BakeMuttonCommand(barbecuer);
BakeChickenWingCommand wingCommand = new BakeChickenWingCommand(barbecuer);
// 开业后 客人下单,通知执行
Waiter waiter = new Waiter();
waiter.addCommand(muttonCommand);
waiter.addCommand(muttonCommand);
waiter.addCommand(wingCommand);
waiter.notifyExecute();
}
}