15_命令模式

2021-01-17  本文已影响0人  真是个点子王

结构

实例


// 订单类
// Order.java
public class Order {
    // 餐桌号码
    private int diningTable;

    // 所下的餐品及份数
    private Map<String,Integer> foodDir = new HashMap<>();

    public int getDiningTable(){
        return diningTable;
    }

    public void setDiningTable(int diningTable) {
        this.diningTable = diningTable;
    }

    public Map<String, Integer> getFoodDir() {
        return foodDir;
    }

    public void setFood(String name,int num) {
        foodDir.put(name,num);
    }
}
// 接收者类
// SeniorChef.java
public class SeniorChef {
    public void makeFood(String name,int num){
        System.out.println(num + "份" + name);
    }
}

// 抽象命令类
// Command.java
public interface Command {
    void execute();
}

// 具体的命令类
// OrderCommand.java
public class OrderCommand implements Command{

    // 持有接收者对象
    private SeniorChef receiver;
    private Order order;

    public OrderCommand(SeniorChef receiver, Order order) {
        this.receiver = receiver;
        this.order = order;
    }

    @Override
    public void execute() {
        System.out.println(order.getDiningTable() + "桌的订单");
        Map<String, Integer> foodDir = order.getFoodDir();
        // 遍历Map集合
        Set<String> keys = foodDir.keySet();
        for(String foodName:keys){
            receiver.makeFood(foodName,foodDir.get(foodName));
        }
        System.out.println(order.getDiningTable() + "桌的餐品准备完毕");
    }
}

// 命令发起者
// Waitor.java
public class Waitor {
    // 持有多个命令对象
    private List<Command> commands = new ArrayList<>();

    public void setCommand(Command command) {
        // 将command对象存储到集合中
        commands.add(command);
    }
    // 发起命令的功能
    public void orderUp(){
        System.out.println("服务员:订单来了");
        for(Command command:commands){
            if(command!=null) {
                command.execute();
            }
        }
    }
}
public class Client {
    public static void main(String[] args) {
        // 创建一个订单对象
        Order order1 = new Order();
        order1.setDiningTable(1);
        order1.setFood("西红柿鸡蛋面",1);
        order1.setFood("可口可乐",2);


        Order order2 = new Order();
        order2.setDiningTable(2);
        order2.setFood("牛肉面",1);
        order2.setFood("百事可乐",2);

        // 创建厨师对象
        SeniorChef receiver = new SeniorChef();
        // 创建命令对象
        OrderCommand cmd1 = new OrderCommand(receiver,order1);
        OrderCommand cmd2 = new OrderCommand(receiver,order2);

        // 创建服务员对象
        Waitor waitor = new Waitor();
        waitor.setCommand(cmd1);
        waitor.setCommand(cmd2);
        waitor.orderUp();
    }
}

优缺点

上一篇 下一篇

猜你喜欢

热点阅读