package designpattern.state; public class Food { private String name; private int manufactureDays;// 出廠天數 private int bestBeforeDays;// 最佳食用天數(從出廠時間算起) private int expiryDays;// 保質期天數 private FoodState foodState; public Food(String name, int bestBeforeDays, int expiryDays) { this.name = name; this.bestBeforeDays = bestBeforeDays; this.expiryDays = expiryDays; this.foodState = new BestBeforeState(); } public void eat() { foodState.reaction(this); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getManufactureDays() { return manufactureDays; } public void setManufactureDays(int manufactureDays) { this.manufactureDays = manufactureDays; } public int getBestBeforeDays() { return bestBeforeDays; } public void setBestBeforeDays(int bestBeforeDays) { this.bestBeforeDays = bestBeforeDays; } public int getExpiryDays() { return expiryDays; } public void setExpiryDays(int expiryDays) { this.expiryDays = expiryDays; } public FoodState getFoodState() { return foodState; } public void setFoodState(FoodState foodState) { this.foodState = foodState; } }
package designpattern.state; public interface FoodState { public void reaction(Food food); }
package designpattern.state; public class BestBeforeState implements FoodState { @Override public void reaction(Food food) { if (food.getManufactureDays() <= food.getBestBeforeDays()) { System.out.print("第" + food.getManufactureDays() + "天吃,"); System.out.println("[" + food.getName() + "]在最佳食用期中,好吃~~"); } else { food.setFoodState(new EatableState()); food.eat(); } } }
package designpattern.state; public class EatableState implements FoodState { @Override public void reaction(Food food) { if (food.getManufactureDays() <= food.getExpiryDays()) { System.out.print("第" + food.getManufactureDays() + "天吃,"); System.out.println("[" + food.getName() + "]在可食用期中,味道還能夠"); } else { food.setFoodState(new ExpiredState()); food.eat(); } } }
package designpattern.state; public class ExpiredState implements FoodState { @Override public void reaction(Food food) { if (food.getManufactureDays() > food.getExpiryDays()) { System.out.print("第" + food.getManufactureDays() + "天吃,"); System.out.println("[" + food.getName() + "]過時了,無法吃了"); } else { food.setFoodState(new EatableState()); food.eat(); } } }
package designpattern.state; public class Client { public static void main(String[] args) { Food food = new Food("麪包", 1, 7);// 設置最佳食用期1天,保質期7天 food.setManufactureDays(1); food.eat(); food.setManufactureDays(3); food.eat(); food.setManufactureDays(10); food.eat(); } }
結果輸出:react
第1天吃,[麪包]在最佳食用期中,好吃~~
第3天吃,[麪包]在可食用期中,味道還能夠
第10天吃,[麪包]過時了,無法吃了