命令模式

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

就是将请求封装装起来,对请求的操作就只需要操作这个对象就行了;

我的理解是:前提是被请求者有多种功能,比如说烧烤摊主,即能烤肉又能拷鸡翅,但是每个顾客的要求又不一样。就必须对烧烤摊主的功能分开封装,然后用一个类来管理。

最先肯定有烧烤摊主这个类:

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();

现在,如果还需要烤扇贝,那么只需要把摊主的这个技能再封装出来,开店的时候在菜单里加上这一项,顾客点单了服务员命令摊主做就是了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值