你的位置:首页 > ASP.net教程

[ASP.net教程]设计模式(二)__装饰设计模式

今天呢,来给大家介绍一下装饰设计模式,java中IO就使用到了这个模式。

  装饰设计模式,顾名思义,就是对一个功能进行装饰,就跟女人化妆一样,人还是本人,但是化了妆就变得比原来更漂亮了。

  需求:当你有个功能是在N年前建立的,如今老大觉得功能不够用了,需要进行增强,那么怎么办呢?

  解决:你就可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。如果这个功能写错了,又可以把自己写的功能去掉而不影响以前的功能,是不是很灵活啊。这个类就是装饰类。

  装饰设计模式呢,主要是对一组类进行功能的增强

  那么什么时候会用到装饰模式呢?

  1.需要扩展一个类的功能,或给一个类增加附加责任

  2.需要动态的给一个对象增加功能,这些功能可以再动态的撤销

  3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实

好了,上菜了。

(由于本人比较笨,想不出什么比较恰当的例子,这里就借鉴一下http://blog.csdn.net/furongkang/article/details/7214100中的例子。什么?你说我懒? 哼,好吧,我承认我懒。)

 

 1 /* 2  3 我家里有两套房子:平房,楼房。 4  5 House 6   |--PingFang 7   |--LouFang 8  9 可是像我这么土豪,又具有强烈的文艺范,又有众多妻妾。。。 相信你已经感觉到了我的霸王之气。10 所以:11   1,对平房进行田园风光式的打造。12   2,对楼房进行欧式风格的打造。13 可以通过继承的方式来完成。14 15 House16   |--PingFang17     |--TianYuanPingFang18   |--LouFang19     |--OuShiLouFang20 21 */22 abstract class House {23   abstract void show();24 }25 26 class PingFang extends House {27   public void show() {28     System.out.println("平房");29   }30 }31 32 class TianYuanPingFang extends PingFang {33   public void showTianYuan() {34     super.show();35     System.out.println("田园风格");36   }37 }38 39 class LouFang extends House {40   public void show() {41     System.out.println("楼房");42   }43 }44 45 class OuShiLouFang extends LouFang {46   public void showOuShi() {47     super.show();48     System.out.println("欧式风格");49   }50 }51 52 class HouseDemo {53   public static void main(String[] args) {54     PingFang p = new PingFang();55     // p.show();56 57     TianYuanPingFang t = new TianYuanPingFang();58     t.showTianYuan();59 60     LouFang l = new LouFang();61     // l.show();62     OuShiLouFang o = new OuShiLouFang();63     o.showOuShi();64   }65 }

 

  上面的代码实现了我需要的功能,但是如果单单为了某个功能而去继承,那么那个体系是非常臃肿的。你说感觉不出来?假如你有几百个类,那么就会需要再写上几百个子类去继承。能累死个人。

  装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。

  装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

使用装饰设计模式进行装饰:

 1 /* 2 原体系: 3 House 4   |--PingFang 5   |--LouFang 6    7 通过继承之后的体系 8 House  9   |--PingFang 10     |--TianYuanPingFang 11   |--LouFang 12     |--OuShiLouFang 13     14 无论将平房打造成田园还是欧式,都是对平房一种装修。15 而该装修也可以用楼房。16 17 将现将该装修定义好,需要把什么房子进行改装修,传入即可。18 House19   |--PingFang20   |--LouFang21   |--TianYuan22   |--OuShi23 24 */25 abstract class House {26   abstract void show();27 }28 29 class PingFang extends House {30   public void show() {31     System.out.println("平房");32   }33 }34 35 class LouFang extends House {36   public void show() {37     System.out.println("楼房");38   }39 }40 41 class TianYuan extends House {42 43   private House h;44 45   TianYuan(House h) {46     this.h = h;47   }48 49   public void show() {50     System.out.println("田园风格");51   }52 53   public void showTianYuan() {54     h.show();55     this.show();56   }57 58 }59 60 class OuShi extends House {61   private House h;62 63   OuShi(House h) {64     this.h = h;65   }66 67   public void show() {68     System.out.println("欧式风格");69   }70 71   public void showOuShi() {72     h.show();73     this.show();74   }75 76 }77 78 class HouseDemo2 {79   public static void main(String[] args) {80     PingFang p = new PingFang();81     LouFang l = new LouFang();82 83     OuShi o = new OuShi(new TianYuan(p));84     o.showOuShi();85 86     // TianYuan t = new TianYuan(l);87     // t.showTianYuan();88 89     // OuShi o = new OuShi(l);90     // o.showOuShi();91   }92 }

是不是好了很多呢。