现在的位置: 首页 > 综合 > 正文

装饰设计模式

2018年03月22日 ⁄ 综合 ⁄ 共 3572字 ⁄ 字号 评论关闭

装饰设计模式就是对已有的对象的功能进行增强

简单小例子:

[java] view
plain
copy

  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
plain
copy

  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
plain
copy

  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. }  

【上篇】
【下篇】

抱歉!评论已关闭.