1. 程式人生 > 其它 >設計模式 命令模式

設計模式 命令模式

設計模式 命令模式

概念

命令符合下面這個場景

結構

案例



定義一個執行介面:

public interface Command {
    void execute();
}

定義訂單類

@Data
public class Order {
    //餐桌號碼
    private int diningTable;

    //用來儲存餐名以及份數
    private Map<String,Integer> foodDic = new HashMap<>();
}

定義接受者 大廚類

public class SeniorChef {

    public void makeFood(int num,String foodName){
        System.out.println(num + "份" + foodName);
    }
}

定義命令物件 整合訂單和大廚

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() + "桌的訂單:");
        Set<String> keys = order.getFoodDic().keySet();
        for(String key : keys){
            receiver.makeFood(order.getFoodDic().get(key),key);
        }
        System.out.println(order.getDiningTable() + "桌的飯做好了");
    }
}

定義釋出命令者 伺服器

public class Waiter {
    private ArrayList<Command> commands;

    public Waiter(ArrayList<Command> commands) {
        this.commands = commands;
    }

    public void addCommand(Command command){
        commands.add(command);
    }

    //發出命令 喊訂單來了 廚師開始執行
    public void orderUp(){
        System.out.println("服務員:訂單來了");
        for (int i = 0; i < commands.size(); i++) {
            Command cmd = commands.get(i);
            if(cmd != null){
                cmd.execute();
            }
        }
    }
}

測試使用:

public class Client {
    public static void main(String[] args) {
        //建立兩個order
        Order order1 = new Order();
        order1.setDiningTable(1);
        order1.getFoodDic().put("西紅柿炒雞蛋",1);
        order1.getFoodDic().put("小杯可樂",2);

        Order order2 = new Order();
        order2.setDiningTable(2);
        order2.getFoodDic().put("漏丸",1);
        order2.getFoodDic().put("雪碧",1);

        //建立接收者
        SeniorChef receiver = new SeniorChef();
        //將訂單和接收者(廚師)封裝成命令物件
    }
}