命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作。
就是将请求封装装起来,对请求的操作就只需要操作这个对象就行了;
我的理解是:前提是被请求者有多种功能,比如说烧烤摊主,即能烤肉又能拷鸡翅,但是每个顾客的要求又不一样。就必须对烧烤摊主的功能分开封装,然后用一个类来管理。
最先肯定有烧烤摊主这个类:
public class Barbecuer {
public void bakeMutton() {
System.out.println("烤肉串");
}
public void bakeChickenWing() {
System.out.println("烤鸡翅");
}
}
如果顾客都直接操作这个类,烧烤摊主肯定分不清谁是谁,估计就会疯了。
那么我们将烧烤摊主的功能都独立出来,用一个命令接口管理
public abstract class Command {
protected Barbecuer receiver;
public Command(Barbecuer receiver) {
this.receiver = receiver;
}
public abstract void ExcuteCommand();
}
不同的功能都分出来封装:
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void ExcuteCommand() {
receiver.bakeMutton();
}
}
public class BakeChickenWingCommand extends Command {
public BakeChickenWingCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void ExcuteCommand() {
receiver.bakeChickenWing();
}
}
然后由服务员来管理顾客的点单,即由一个类来管理烧烤摊主该烤什么,这就是前面将摊主的功能都分离出来的好处。
public class Waiter {
private List<Command> orders = new ArrayList<Command>();
public void setOrder(Command command) {
orders.add(command);
}
public void cancelOrder(Command command) {
orders.remove(command);
}
public void notifier() {
for (Command command : orders) {
command.ExcuteCommand();
}
}
}
主流程代码:
//开店准备
Barbecuer boy = new Barbecuer();
Command bakeMuttonCommand = new BakeMuttonCommand(boy);
Command bakeChickenWingCommand = new BakeChickenWingCommand(boy);
Waiter girl = new Waiter();
//服务员根据客户点单下命令给摊主做什么烧烤
girl.setOrder(bakeMuttonCommand);
girl.setOrder(bakeMuttonCommand);
girl.setOrder(bakeChickenWingCommand);
girl.notifier();
现在,如果还需要烤扇贝,那么只需要把摊主的这个技能再封装出来,开店的时候在菜单里加上这一项,顾客点单了服务员命令摊主做就是了。