大话设计模式----命令模式

一、命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

二、代码示例:

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.由于新加进的具体命令类不影响其他的类,因此增加新的具体命令类很容易

 敏捷开发的原则告诉我们不要为代码添加基于猜测的、实际不需要的功能。需要的时候可以进行重构。

posted @ 2020-04-13 22:44  Eden-programmer  阅读(160)  评论(0)    收藏  举报