大话设计模式----命令模式
一、命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
二、代码示例:
public class Barbecue { public void bakeMutton(){ System.out.println("烤羊肉串"); } public void bakeChickenWing(){ System.out.println("烤鸡翅"); } } public abstract class Command { protected Barbecue receiver; public Command(Barbecue receiver) { this.receiver = receiver; } abstract public void excuteCommand(); } public class BakeChickenWingCommand extends Command { public BakeChickenWingCommand(Barbecue receiver) { super(receiver); } @Override public void excuteCommand() { receiver.bakeChickenWing(); } } public class BakeMuttonCommand extends Command { public BakeMuttonCommand(Barbecue receiver) { super(receiver); } @Override public void excuteCommand() { receiver.bakeMutton(); } } public class Waiter { private List<Command> orders = new ArrayList<>(); public void setOrder(Command command){ if(command instanceof BakeChickenWingCommand){ System.out.println("服务员:鸡翅没有了,请点别的烧烤。"); }else{ orders.add(command); System.out.println("增加订单:" + command.toString() + "时间" + new Date()); } } public void cancleOrder(Command command){ orders.remove(command); System.out.println("取消订单" + command.toString() + "时间" + new Date()); } public void notice(){ orders.forEach(Command::excuteCommand); } } public class Main { public static void main(String[] args) { Barbecue boy = new Barbecue(); Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); Command bakeMuttonCommand2 = new BakeMuttonCommand(boy); Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy); Waiter girl = new Waiter(); girl.setOrder(bakeMuttonCommand1); girl.setOrder(bakeMuttonCommand2); girl.setOrder(bakeChickenWingCommand1); girl.notice(); } }
三、优点
1.能较容易的设计一个命令队列
2.在需要的情况下,可以较容易地将命令记入日志
3.允许接收请求的一方决定是否要否决请求
4.可以容易地实现对请求的撤销和重做
5.由于新加进的具体命令类不影响其他的类,因此增加新的具体命令类很容易
敏捷开发的原则告诉我们不要为代码添加基于猜测的、实际不需要的功能。需要的时候可以进行重构。

浙公网安备 33010602011771号