裝飾者模式

裝飾者模式:動(dòng)態(tài)地將責(zé)任附加到對(duì)象上,若要擴(kuò)展對(duì)象,裝飾者模式提供了比繼承更彈性的替代方案
要點(diǎn): 裝飾者與被裝飾者擁有共同的超類,繼承的目的是繼承類型,而不是行為

裝飾者包含一個(gè)超類的對(duì)象,這樣,可以在被裝飾者行為前或者行為后加上新的行為,甚至取代原有的行為
裝飾者會(huì)使程序中出現(xiàn)很多小類,增加使用難度

使用場(chǎng)景:對(duì)象由主體+許多可選的部件或者功能構(gòu)成,使用繼承或者接口會(huì)產(chǎn)生很多類,且很難擴(kuò)展。例如,現(xiàn)在需要一個(gè)漢堡,主體是雞腿堡,可以選擇添加生菜、醬、辣椒等等許多其他的配料,這種情況下就可以使用裝飾者模式。

實(shí)例:

漢堡基類


package decorator;  
  
public abstract class Humburger {  
      
    protected  String name ;  
      
    public String getName(){  
        return name;  
    }  
      
    public abstract double getPrice();  
  
}  

雞腿堡類


package decorator;  
  
public class ChickenBurger extends Humburger {  
      
    public ChickenBurger(){  
        name = "雞腿堡";  
    }  
  
    @Override  
    public double getPrice() {  
        return 10;  
    }  
  
}  

配料的基類


package decorator;  
  
public abstract class Condiment extends Humburger {  
      
    public abstract String getName();  
  
}  

生菜

package decorator;  
  
public class Lettuce extends Condiment {  
      
    Humburger humburger;  
      
    public Lettuce(Humburger humburger){  
        this.humburger = humburger;  
    }  
  
    @Override  
    public String getName() {  
        return humburger.getName()+" 加生菜";  
    }  
  
    @Override  
    public double getPrice() {  
        return humburger.getPrice()+1.5;  
    }  
  
}  

辣椒

package decorator;  
  
public class Chilli extends Condiment {  
      
    Humburger humburger;  
      
    public Chilli(Humburger humburger){  
        this.humburger = humburger;  
          
    }  
  
    @Override  
    public String getName() {  
        return humburger.getName()+" 加辣椒";  
    }  
  
    @Override  
    public double getPrice() {  
        return humburger.getPrice();  //辣椒是免費(fèi)的哦  
    }  
  
}  

測(cè)試

package decorator;  
  
public class Test {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        Humburger humburger = new ChickenBurger();  
        System.out.println(humburger.getName()+"  價(jià)錢:"+humburger.getPrice());  
        Lettuce lettuce = new Lettuce(humburger);  
        System.out.println(lettuce.getName()+"  價(jià)錢:"+lettuce.getPrice());  
        Chilli chilli = new Chilli(humburger);  
        System.out.println(chilli.getName()+"  價(jià)錢:"+chilli.getPrice());  
        Chilli chilli2 = new Chilli(lettuce);  
        System.out.println(chilli2.getName()+"  價(jià)錢:"+chilli2.getPrice());  
    }  
  
}  

輸出

雞腿堡  價(jià)錢:10.0  
雞腿堡 加生菜  價(jià)錢:11.5  
雞腿堡 加辣椒  價(jià)錢:10.0  
雞腿堡 加生菜 加辣椒  價(jià)錢:11.5  

來(lái)源:http://blog.csdn.net/lansuiyun/article/details/11714957

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容