读书人

研磨设计方式之装饰模式-3

发布时间: 2012-07-18 12:05:41 作者: rapoo

研磨设计模式之装饰模式-3

3? 模式讲解

3.1? 认识装饰模式

(1)模式功能
??????? 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观。当装饰过后,从外部使用系统的角度看,就不再是使用原始的那个对象了,而是使用被一系列的装饰器装饰过后的对象。
??????? 这样就能够灵活的改变一个对象的功能,只要动态组合的装饰器发生了改变,那么最终所得到的对象的功能也就发生了改变。
??????? 变相的还得到了另外一个好处,那就是装饰器功能的复用,可以给一个对象多次增加同一个装饰器,也可以用同一个装饰器装饰不同的对象。


(2)对象组合
??????? 前面已经讲到了,一个类的功能的扩展方式,可以是继承,也可以是功能更强大、更灵活的对象组合的方式。
??????? 其实,现在在面向对象设计中,有一条很基本的规则就是“尽量使用对象组合,而不是对象继承”来扩展和复用功能。装饰模式的思考起点就是这个规则,可能有些朋友还不太熟悉什么是“对象组合”,下面介绍一下“对象组合”。
什么是对象组合
??????? 直接举例来说吧,假若有一个对象A,实现了一个a1的方法,而C1对象想要来扩展A的功能,给它增加一个c11的方法,那么一个方案是继承,A对象示例代码如下:

Java代码??研磨设计方式之装饰模式-3
  1. public?class?A?{??
  2. ????public?void?a1(){??
  3. ????????System.out.println("now?in?A.a1");??
  4. ????}??
  5. }??

?

C1对象示例代码如下:

Java代码??研磨设计方式之装饰模式-3
  1. public?class?C1?extends?A{??
  2. ????public?void?c11(){??
  3. ????????System.out.println("now?in?C1.c11");??
  4. ????}??
  5. }??

?

??? 另外一个方案就是使用对象组合,怎么组合呢?就是在C1对象里面不再继承A对象了,而是去组合使用A对象的实例,通过转调A对象的功能来实现A对象已有的功能,写个新的对象C2来示范,示例代码如下:

Java代码??研磨设计方式之装饰模式-3
  1. public?class?C2?{??
  2. ????/**?
  3. ?????*?创建A对象的实例?
  4. ?????*/??
  5. ????private?A?a?=?new?A();??
  6. ??
  7. ????public?void?a1(){??
  8. ????????//转调A对象的功能??
  9. ????????a.a1();??
  10. ????}??
  11. ????public?void?c11(){??
  12. ????????System.out.println("now?in?C2.c11");??
  13. ????}??
  14. }???

?

大家想想,在转调前后是不是还可以做些功能处理呢?对于A对象是不是透明的呢?

对象组合是不是也很简单,而且更灵活了:

读书人网 >软件开发

热点推荐