2019年5月13日 星期一

7天學會設計模式 CHAP09 命令模式 Command

7天學會設計模式
http://www.books.com.tw/products/0010750585

命令模式 Command
目的:將各種請求(命令Command)封裝成一個物件。
package com.ssc24.chap09.demo01;
public class Barkeep implements KitchenWorker {
 @Override
 public void finishOrder() {
  System.out.println("拿出杯子->加滿冰塊->把飲料倒進杯子->飲料完成");
 }
}

package com.ssc24.chap09.demo01;
public class Chef implements KitchenWorker {
 @Override
 public void finishOrder() {
  System.out.println("取出麵包->美乃滋塗上滿滿的麵包->丟進烤箱->灑上可以吃的裝飾->點心完成");
 }
}

package com.ssc24.chap09.demo01;
public abstract class Order {
 protected KitchenWorker receiver;
 protected String name;
 public Order(KitchenWorker receiver) {
  this.receiver = receiver;
 }
 public void sendOrder() {
  receiver.finishOrder();
 }
 public String getName() {
  return this.name;
 }
}

package com.ssc24.chap09.demo01;
public class SnackOrder extends Order {
 public SnackOrder(KitchenWorker receiver) {
  super(receiver);
  super.name = "snackOrder";
 }
}

package com.ssc24.chap09.demo01;
import java.util.ArrayList;
import java.util.List;
public class Waitress {
 private int snackQty = 2;
 private int drinkQty = 4;
 private List<Order> orderList = new ArrayList<Order>();
 public void setOrder(Order order) {
  if (order.name.equals("snackOrder")) {
   if (this.snackQty <= 0) {
    System.out.println("點心賣完了");
   } else {
    System.out.println("增加點心訂單");
    this.snackQty--;
    this.orderList.add(order);
   }
  }
  if (order.name.equals("drinkOrder")) {
   if (this.drinkQty <= 0) {
    System.out.println("影料賣完了");
   } else {
    System.out.println("增加飲料訂單");
    this.drinkQty--;
    this.orderList.add(order);
   }
  }
 } //end setOrder
 public void cancelOrder(Order order) {
  if (order.name.equals("snackOrder")) {
   this.snackQty++;
   System.out.println("取消一個點心");
  }
  if (order.name.equals("drinkOrder")) {
   this.drinkQty++;
   System.out.println("取消一杯飲料");
  }
  this.orderList.remove(order);
 } // end cancelOrder
 public void notifyBaker() {
  for (Order order :orderList) {
   order.sendOrder();
  }
  orderList.clear();
 }
}

package com.ssc24.chap09.demo01;
public class CoffeShopClient {
 public static void main(String[] args) {
  System.out.println("===命令模式測試===");
  Chef snackChef = new Chef();
  Barkeep barkeep = new Barkeep();
  Order snakOrder = new SnackOrder(snackChef);
  Order drinkOrder = new DrinkOrder(barkeep);
  Waitress cuteGirl = new Waitress();
  System.out.println("===客人點餐===");
  cuteGirl.setOrder(snakOrder);
  cuteGirl.setOrder(drinkOrder);
  cuteGirl.setOrder(snakOrder);
  cuteGirl.setOrder(drinkOrder);
  cuteGirl.setOrder(drinkOrder);
  cuteGirl.setOrder(drinkOrder);
  cuteGirl.notifyBaker();
  cuteGirl.setOrder(snakOrder);
  cuteGirl.setOrder(drinkOrder);
 }
}

/**
===命令模式測試===
===客人點餐===
增加點心訂單
增加飲料訂單
增加點心訂單
增加飲料訂單
增加飲料訂單
增加飲料訂單
取出麵包->美乃滋塗上滿滿的麵包->丟進烤箱->灑上可以吃的裝飾->點心完成
拿出杯子->加滿冰塊->把飲料倒進杯子->飲料完成
取出麵包->美乃滋塗上滿滿的麵包->丟進烤箱->灑上可以吃的裝飾->點心完成
拿出杯子->加滿冰塊->把飲料倒進杯子->飲料完成
拿出杯子->加滿冰塊->把飲料倒進杯子->飲料完成
拿出杯子->加滿冰塊->把飲料倒進杯子->飲料完成
點心賣完了
影料賣完了
**/