幸运星空

Lucker的程序人生

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

(根据MSDN Webcast相关课程整理)

假设场景:游戏中的坦克不仅具有类型的不同,可能同一种坦克也会有不同,如我们可能会希望为某种类型的坦克,如T50,增加(扩展)一种或多种新功能。如果增加红外夜视功能,水陆两栖功能或卫星定位功能等等。通常我们可能会采用继承的方法,扩展出新的子类型(如T50红外版新类型)来实现新功能的扩展。显然,这样做有一个明显的弊端:同时具有以上特征的或部分功能的坦克,这样就会产生N多种新的组合,子类的数目呈指数级膨胀。从而过多的使用了继承来实现子类的特性。

因此,当特性的变化呈横向变化时,我们希望动态的实现(运行时)功能的增多,避免功能扩展带来子类膨胀的问题,从而使变化的影响降到最低。

装饰模式旨在解决主体类在多个方向的功能扩展的问题。

clip_image002

上图中,Decorator抽象类有时也可以省略,其子类直接从Component类中继承,并将组合一个Component对象,同时实现具体方法。

GoF:动态的给一个对象增加一些额外的功能,就增加功能而言,Decorator模式比生成子类更加灵活。

坦克抽象类及其子类,这是纵向的变化,我们可以考虑创建型模式来产生新对象:

clip_image004

扩展功能,装饰类及其子类,这是横向功能的变化,关键是不仅继承了Tank,而且还组合了一个Tank对象,这样新生成的被装饰的Tank就可以一方具体原有的特性,而且还可以具有新装饰的功能。而Tank类对Decorator类是透明的,反之不然。

Is a 和 has a同时使用,就现实了简单的装饰模式 do as。

clip_image006

面对坦克类型自身的纵向变化和扩展功能的横向变化,将扩展功能一个一个的添加到现有类型上,从而得到具有新功能的新类型。

clip_image008

.Net框架中装饰模式的应用:

Stream抽象类实现了FileStream类,NetworkStream类和MemoryStream类等实体类,同时也具有装饰对象子类:BufferedStream和CryptStream等。两个装饰类中分别包含了Stream类。

image

《完》
posted on 2011-12-26 18:02  Lucker  阅读(508)  评论(0编辑  收藏  举报