java裝飾者模式

轉載連接:http://blog.csdn.net/cai1213/article/details/8003445java

 裝飾者模式ide

動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。測試

具體被裝飾者和抽象裝飾類都繼承於抽象被裝飾者類,繼承的是類型,而不是行爲。行爲來自裝飾者和基礎組件,或與其餘裝飾者之間的組合關係。this

裝飾者一般是用其餘相似於工廠或生成器這樣的模式建立的。spa

    

       具體例子.net

抽象被繼承者類:Beverage.java設計

[java]  view plain copy
  1. package com.designpattern.decorator;  
  2.   
  3. //被裝飾者抽象類  
  4. public abstract class Beverage {  
  5.     String description = "Unknown Beverage";  
  6.       
  7.     public String getDescription(){  
  8.         return description;  
  9.     }  
  10.       
  11.     public abstract double cost();  
  12. }  

具體被裝飾類:HouseBlend.java, DarkRoast.java, Decat.java, Espresso.java,只給出一個,其餘相似

[java]  view plain copy
  1. package com.designpattern.decorator;  
  2.   
  3. //被裝飾者具體類  
  4. public class HouseBlend extends Beverage{  
  5.   
  6.     public HouseBlend(){  
  7.         description = "House Blend Coffee";  
  8.     }  
  9.       
  10.     @Override  
  11.     public double cost() {  
  12.         // TODO Auto-generated method stub  
  13.         return 0.89;  
  14.     }  
  15.   
  16. }  

裝飾者抽象類:CondimentDecorator.java

[java]  view plain copy
  1. package com.designpattern.decorator;  
  2.   
  3. //裝飾者抽象類  
  4. public abstract class CondimentDecorator extends Beverage{  
  5.     public abstract String getDescription();  
  6. }  

具體裝飾者類:Mocha.java,Soy.java,Milk.java,Whip.java,只給出一個,其餘相似

[java]  view plain copy
  1. package com.designpattern.decorator;  
  2.   
  3. //裝飾者的具體類  
  4. public class Mocha extends CondimentDecorator{  
  5.     Beverage beverage;  
  6.       
  7.     public Mocha(Beverage beverage){  
  8.         this.beverage = beverage;  
  9.     }  
  10.   
  11.     @Override  
  12.     public String getDescription() {  
  13.         // TODO Auto-generated method stub  
  14.         return beverage.getDescription() + ", Mocha";  
  15.     }  
  16.   
  17.     @Override  
  18.     public double cost() {  
  19.         // TODO Auto-generated method stub  
  20.         return 0.20 + beverage.cost();  
  21.     }  
  22.   
  23. }  


測試類:Test.java

[java]  view plain copy
  1. package com.designpattern.decorator;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         //不須要調料,即沒有裝飾者  
  6.         Beverage beverage1 = new Espresso();  
  7.         System.out.println(beverage1.getDescription() + " $" + beverage1.cost());  
  8.           
  9.         //使用了三個裝飾者來裝飾DarkRoast  
  10.         Beverage beverage2 = new DarkRoast();  
  11.         beverage2 = new Mocha(beverage2);  
  12.         beverage2 = new Soy(beverage2);  
  13.         beverage2 = new Whip(beverage2);  
  14.         System.out.println(beverage2.getDescription() + " $" + beverage2.cost());  
  15.           
  16.         //使用了兩個裝飾者來裝飾HouseBlend  
  17.         Beverage beverage3 = new HouseBlend();  
  18.         beverage3 = new Mocha(beverage3);  
  19.         beverage3 = new Soy(beverage3);  
  20.         System.out.println(beverage3.getDescription() + " $" + beverage3.cost());  
  21.           
  22.     }  
  23. }  

          要點總結

1)繼承屬於擴展形式之一,但不見得是達到彈性設計的最佳方式。對象

2)在設計中,應該容許行爲能夠被擴展,而無須修改現有的代碼。blog

3)組合和委託可用於在運行時動態地加上新的行爲。繼承

4)除了繼承,裝飾者模式也能夠讓咱們擴展行爲。

5)裝飾者模式意味着一羣裝飾者類,這些類用來包裝具體組件。

6)裝飾者類反映出被裝飾的組件類型(事實上,他們具備相同的類型,都通過接口或繼承實現)。

7)裝飾者能夠在被裝飾者的行爲前面與/或後面加上本身的行爲,甚至將被裝飾者的行爲整個取代掉,而達到特定的目的。

8)能夠用無數個裝飾者包裝一個組件。

9)裝飾者通常對組件的客戶是透明的,除非客戶程序依賴於組件的具體類型。

10)裝飾者會致使設計中出現許多小對象,若是過分使用,會讓程序變得很複雜

相關文章
相關標籤/搜索