设计模式(Design pattern)之命令模式(Command Pattern)

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。
命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

点菜清单


/**
 * 命令模式 - 订单类
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Order {

    // 台号
    private String tableId;
    // 菜品和菜份
    private Map<String,Integer> dishesAndNum =  new HashMap<String,Integer>();

    public String getTableId() {
        return tableId;
    }

    public void setTableId(String tableId) {
        this.tableId = tableId;
    }

    public Map<String, Integer> getDishesAndNum() {
        return dishesAndNum;
    }

    // 调整为下面的 setDishesList
    public void setDishesAndNum(Map<String, Integer> dishesAndNum) {
        this.dishesAndNum = dishesAndNum;
    }

    // 设置点菜列表的菜品和数量
    public void setDishesList(String dishesName,int num){
        dishesAndNum.put(dishesName,num);
    }
}

厨师

/**
 * 命令模式 - 厨师
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Cook {

    public void makeCook(String dishesName,int num) {
        System.out.println(dishesName + " 菜品  -- " + num + "份。");
    }

}

服务员

/**
 * 命令模式 - 调用者:服务员
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Waiter {

    // 命令对象
    private List<Command> commands = new ArrayList<Command>();

    // 设置命令到 List
    public void setCommand(Command command){
        commands.add(command);
    }

    // 发起
    public void sayOrder() {
        System.out.println("服务员 Say: 新订单来了 !");

        for (Command command : commands) {
            if (command !=  null) {
                command.doDishes();
            }
        }
    }

}

命令

/**
 * 命令模式 - 抽象命令类
 * @version 0.1
 * @author  BaiJing.biz
 */
public interface Command {

    void doDishes();
}

/**
 * 命令模式 - 实例命令类
 * @version 0.1
 * @author  BaiJing.biz
 */
public class OrderCommand implements Command {

    // 接受者对象 (receiver)
    private Cook cook;
    // 订单
    private Order order;

    public OrderCommand(Order order, Cook cook) {
        this.order = order;
        this.cook = cook;
    }

    @Override
    public void doDishes() {
        System.out.println(order.getTableId() + " 桌,订单: ");
        Map<String, Integer> dishesList  = order.getDishesAndNum();
        // 展示菜单列表
        Set<String> keys = dishesList.keySet();
        for (String dishesName : keys) {
            cook.makeCook(dishesName, dishesList.get(dishesName));
        }

        System.out.println(order.getTableId() + "桌菜品已经准备完成。上菜。");
    }
}

客户


public class CustomerRun {
    public static void main(String[] args) {

        // 订单
        Order o1  = new Order();
        Order o2  = new Order();

        // 初始化 菜单list
        o1.setTableId("01");
        o1.setDishesList("薄荷牛肉",1);
        o1.setDishesList("清汤面",1);
        o1.setDishesList("凉啤酒",2);

        o2.setTableId("02");
        o2.setDishesList("川味烤鱼",1);
        o2.setDishesList("米饭",3);
        o2.setDishesList("热米酒",3);


        // 厨师
        Cook cook = new Cook();

        OrderCommand c1 = new OrderCommand(o1,cook);
        OrderCommand c2 = new OrderCommand(o2,cook);

        // 服务员
        Waiter waiter = new Waiter();

        waiter.setCommand(c1);
        waiter.setCommand(c2);

        // 服务员对厨师发命令
        waiter.sayOrder();

    }
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值