裝飾設計模式

裝飾設計模式就是對已有的對象的功能進行增強

簡單小例子:

[java] view plaincopy
  1. class Person  
  2. {  
  3.     void chifan()  
  4.     {  
  5.         System.out.println("chifan");  
  6.     }  
  7. }  
  8.   
  9. /* 
  10. 爲了不隨便改變原有的代碼。 
  11. 還要增強chifan功能。 
  12. 那麼就定義一個類,對原有對象進行裝飾。 
  13. */  
  14. class NewPerson  
  15. {  
  16.     private Person p;  
  17.     NewPerson(Person p)  
  18.     {  
  19.         this.p = p;  
  20.     }  
  21.     public void newChifan()  
  22.     {     
  23.         System.out.println("來一杯");  
  24.         p.chifan();  
  25.         System.out.println("來一根");  
  26.     }  
  27. }  
  28.   
  29. class  PersonDemo  
  30. {  
  31.     public static void main(String[] args)   
  32.     {  
  33.         Person p = new Person();  
  34.           
  35.         //NewPerson np = new NewPerson(p);  
  36.         //np.newChifan();  
  37.   
  38.         p.chifan();  
  39.     }  
  40. }  


我們考慮一下使用繼承也可以對父類中的功能進行增強只需要調用super就可以調用父類的方法,那使用裝飾和繼承有什麼區別?
使用繼承體系就會有點臃腫,因爲當平房想要改成歐式時,還要建立子類。

Writer
|--FileWriter  
|--BufferedFileWriter。
|--DataWriter
|--BufferedDataWriter。
|--MediaWriter
|--BufferedMediaWriter.

優化:
可以將緩衝技術單獨抽取進行封裝。
要緩衝區誰將誰和緩衝相關聯即可。
這樣的設計的相對體系會變的簡單。

使用繼承帶來的侷限性:

[java] view plaincopy
  1. /* 
  2. 房子:平房,樓房。 
  3.  
  4. House 
  5.     |--PingFang 
  6.     |--LouFang 
  7.  
  8.  
  9. 準備對房子進行裝修。 
  10.  
  11.     1,對平房進行田園風光式的打造。 
  12.     2,對樓房進行歐式風格的打造。 
  13. 可以用繼承的方式來完成。 
  14. House 
  15.     |--PingFang 
  16.         |--TianYuanPingFang 
  17.     |--LouFang 
  18.         |--OuShiLouFang 
  19.  
  20.      
  21. 該體系就有點臃腫,因爲當平房想要改成歐式時,還要建立子類。 
  22. */  
  23. abstract class House  
  24. {  
  25.     abstract void show();  
  26. }  
  27.   
  28. class PingFang extends House  
  29. {  
  30.     public void show()  
  31.     {  
  32.         System.out.println("平房");  
  33.     }  
  34. }  
  35.   
  36. class TianYuanPingFang extends PingFang  
  37. {  
  38.     public void showTianYuan()  
  39.     {  
  40.         super.show();  
  41.         System.out.println("田園風格");  
  42.     }     
  43. }  
  44.   
  45. class LouFang extends House  
  46. {  
  47.     public void show()  
  48.     {  
  49.         System.out.println("樓房");  
  50.     }  
  51. }  
  52. class OuShiLouFang extends LouFang  
  53. {  
  54.     public void showOuShi()  
  55.     {  
  56.         super.show();  
  57.         System.out.println("歐式風格");  
  58.     }  
  59. }  
  60.   
  61.   
  62.   
  63. class  HouseDemo  
  64. {  
  65.     public static void main(String[] args)   
  66.     {  
  67.         PingFang p = new PingFang();  
  68.         ///p.show();  
  69.   
  70.         TianYuanPingFang t = new TianYuanPingFang();  
  71.         t.showTianYuan();  
  72.   
  73.   
  74.         LouFang l = new LouFang();  
  75.         //l.show();  
  76.         OuShiLouFang o = new OuShiLouFang();  
  77.         o.showOuShi();  
  78.     }  
  79. }  

使用裝飾設計模式進行裝飾:

[java] view plaincopy
  1. /* 
  2.  
  3. 原體系: 
  4. House 
  5.     |--PingFang 
  6.     |--LouFang 
  7. 無論將平房打造成田園還是歐式,都是對平房一種裝修。 
  8. 而該裝修也可以用樓房。 
  9.  
  10. 將現將該裝修定義好,需要把什麼房子進行改裝修,傳入即可。 
  11. House 
  12.     |--PingFang 
  13.     |--LouFang 
  14.     |--TianYuan 
  15.     |--OuShi 
  16.  
  17. */  
  18. abstract class House  
  19. {  
  20.     abstract void show();  
  21. }  
  22.   
  23. class PingFang extends House  
  24. {  
  25.     public void show()  
  26.     {  
  27.         System.out.println("平房");  
  28.     }  
  29. }  
  30.   
  31.   
  32. class LouFang extends House  
  33. {  
  34.     public void show()  
  35.     {  
  36.         System.out.println("樓房");  
  37.     }  
  38. }  
  39.   
  40.   
  41. class TianYuan extends House  
  42. {  
  43.   
  44.     private House h;  
  45.     TianYuan(House h)  
  46.     {  
  47.         this.h = h;  
  48.     }  
  49.     public void show()  
  50.     {  
  51.         System.out.println("田園風格");  
  52.     }  
  53.   
  54.     public void showTianYuan()  
  55.     {  
  56.         h.show();  
  57.         this.show();  
  58.     }  
  59.   
  60. }  
  61.   
  62.   
  63. class OuShi extends House  
  64. {  
  65.     private House h;  
  66.     OuShi(House h)  
  67.     {  
  68.         this.h = h;  
  69.     }  
  70.     public void show()  
  71.     {  
  72.         System.out.println("歐式風格");  
  73.     }  
  74.   
  75.     public void showOuShi()  
  76.     {  
  77.         h.show();  
  78.         this.show();  
  79.     }  
  80.   
  81. }  
  82.   
  83. class  HouseDemo2  
  84. {  
  85.     public static void main(String[] args)   
  86.     {  
  87.         PingFang p = new PingFang();  
  88.         LouFang l = new LouFang();  
  89.   
  90.         OuShi o = new OuShi(new TianYuan(p));  
  91.         o.showOuShi();  
  92.   
  93.         //TianYuan t = new TianYuan(l);  
  94.         //t.showTianYuan();  
  95.   
  96.         //OuShi o = new OuShi(l);  
  97.         //o.showOuShi();  
  98.     }  
  99. }  

發佈了56 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章