命令模式 Command Pattern
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
小明的西餐店正式开业了,为了提高点餐体验和效率,他凭借程序员的经验,引入设计模式来设计点餐流程。这次,用到的是命令模式。
看图:
命令模式的优点是降低请求者(Waiter)和接收者(Chef)的耦合度,服务员知道菜单就可以了,不需要认识每个厨师,而增加菜品可以通过扩展Command子类来实现,满足开闭原则。
代码:
public class Chef {
public void cookPizza() {
System.out.println("制作披萨");
}
public void cookSalad() {
System.out.println("制作沙拉");
}
}
public interface Command {
void execute();
}
public class PizzaCommand implements Command {
private Chef chef;
public PizzaCommand(Chef chef) {
this.chef = chef;
}
@Override
public void execute() {
chef.cookPizza();
}
}
public class SaladCommand implements Command {
private Chef chef;
public SaladCommand(Chef chef) {
this.chef = chef;
}
@Override
public void execute() {
chef.cookSalad();
}
}
public class Waiter {
private List<Command> commandList = new ArrayList<>();
public void setOrder(Command command) {
commandList.add(command);
}
public void call() {
System.out.println("下单");
for(Command command : commandList) {
command.execute();
}
}
}
客户端:
public class Client {
public static void main(String[] args) {
Chef chef = new Chef();
Waiter waiter = new Waiter();
Command pizzaCommand = new PizzaCommand(chef);
System.out.println("顾客点了披萨");
waiter.setOrder(pizzaCommand);
Command saladCommand = new SaladCommand(chef);
System.out.println("顾客点了沙拉");
waiter.setOrder(saladCommand);
waiter.call();
}
}
顾客点了披萨
顾客点了沙拉
下单
制作披萨
制作沙拉