裝飾者模式類似於代理,你將一個對象傳進去裝飾類,它將此對象的同名方法做一些加強 1.要被修飾的父類 2.裝飾的父類 3.創建兩種被修飾的類 4.創建裝飾類 5.組合(把被修飾的類進行裝飾加強) 結果是這樣的: tip:這裡,你可以說,幹嘛這麼麻煩,繼承不就搞定了,但是,你有沒有想過,如果萬一有一點, ...
裝飾者模式類似於代理,你將一個對象傳進去裝飾類,它將此對象的同名方法做一些加強
1.要被修飾的父類
/** * 糧食 * @author Administrator * */ public abstract class Beverage { String description="Unknown Beverage"; public String getDescription(){ return this.description; } public abstract double cost(); }
2.裝飾的父類
/** * 加料 * @author Administrator * */ public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
3.創建兩種被修飾的類
public class Rice extends Beverage { public Rice(){ description="飯"; } @Override public double cost() { // TODO Auto-generated method stub return 2.00; } } public class Noodle extends Beverage { public Noodle() { description="粉"; } @Override public double cost() { // TODO Auto-generated method stub return 1.00; } }
4.創建裝飾類
public class Egg extends CondimentDecorator { private Beverage beverage; public Egg(Beverage beverage) { this.beverage=beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return "蛋炒"+this.beverage.getDescription(); } @Override public double cost() { // TODO Auto-generated method stub return 0.5+this.beverage.cost(); } }
5.組合(把被修飾的類進行裝飾加強)
public class Cook { public static void main(String[] args) { //飯 Rice rice=new Rice(); //粉 Noodle noodle=new Noodle(); //蛋炒飯 Egg eggRice=new Egg(rice); System.out.println("套餐:"+eggRice.getDescription()+",售價:"+eggRice.cost()); //蛋炒粉 Egg eggNoodle=new Egg(noodle); System.out.println("套餐:"+eggNoodle.getDescription()+",售價:"+eggNoodle.cost()); //炒飯再加個蛋 Egg eggDoubleNoodle=new Egg(eggRice); System.out.println("套餐:"+eggDoubleNoodle.getDescription()+",售價:"+eggDoubleNoodle.cost()); } }
結果是這樣的:
tip:這裡,你可以說,幹嘛這麼麻煩,繼承不就搞定了,但是,你有沒有想過,如果萬一有一點,沒有蛋炒飯和蛋炒粉這菜式了,那這兩個類不就廢棄了嗎,而且還要重新寫,但是如果你做成組件形式的,即使你沒有這兩樣菜式了,但是只要是蛋炒別的,那你照樣可以用這個調料裝飾類。這樣子不只提高了類的可用性,更減少了類的無限增長.關鍵點就是通過註入來繼承被裝飾類的方法和欄位,而不是通過簡單地繼承父類的信息。