看完装饰设计模式~~~始终不明不白
看了一下人家博客的介绍,在以下情况下应当使用装饰模式:  1。需要扩展一个类的功能,或给一个类增加附加责任。  2。需要动态地给一个对象增加功能,这些功能可以再动态地撤销。  3。需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。有3个问题不是很清楚~~`
1。“1”和“2”给我的感觉是~~类的某个对象需要添加额外的逻辑,在Main方法中使用时直接添加需要的逻辑不便于维护,用子类来实现又有点多余。不知道这样理解对吗?2。现在写的代码还很少不能明白“3”当中的含义~~望大家指点一下.3。为什么装饰类与被装饰类都要继承同一个接口或抽象类(Component),不继承它不是同样能达到目的吗?

解决方案 »

  1.   

    不要为了模式而模式,
    装饰模式的一个通俗例子是tooltip控件,当你往窗体上拖放一个tooltip(帮助提示)控件时,窗体中的每一个控件都会多出几个tooltip属性来,
    就是你说的 :1。需要扩展一个类的功能,或给一个类增加附加责任。
    由于tooltip可以删除,所以:2。需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
    有时候可以通过子类继承的方式来实现扩展,但没有装饰来的优雅即:3。需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
      

  2.   

    你在设计模式中见过直截了当的“委托”和“事件”么?不妨在先在.net知识里去搞明白。
      

  3.   

    抛出事件通知这谈不上什么“继承”,说它用于替代继承时小题大作了,原因是那些人按照设计模式上的过分繁琐的形式来学,以致产生了幻觉,联想到继承上去了。比如你要设计一个Grid控件,你不知道当使用这个控件的其它程序员如何扩展Cell的编辑功能,那么你就触发一个“CellEditing”和一个“CellEdited”事件就好了。在.net中,这不需要纠结繁琐的形式。特别是,事件的类型定义是Grid中的职责,并且只需要一句话就定义好了。
      

  4.   

    哦当然,这里不是为了强调事件本身。实际上如果GOF懂得委托和事件的话,那么24和模式也就剩下不足10个,其它的都可以简单地消除了,也就是都是委托和事件的简单应用。比如你要扩展一个Grid,那么你写了一个自己的MyGrid类,它只是包含一个Grid控件,然后处理了Grid中许多事件,在事件处理方法中去追加你要的处理细节,那么你的这个Grid就看起来很像是Grid,但是细节增加了很多。这是任何一个使用微软开发工具平台里的控件的人都很容易学到的,许多人就是用鼠标往用户控件里拖进一个核心的控件然后编写几百行代码来扩展这个核心控件,最后把这个用户控件当作这个核心控件的所谓新的包装来使用。
      

  5.   

    这本书,其实还算不错,我是在msdn下了设计模式的视频,同步进行,讲师是李建忠老师.
      

  6.   

    学设计模式最好先别想怎么套用他们,最重要是领悟设计原则,为什么要这么设计,这些模式是怎么设计出来的。
    初学者才会千方百计想着套用设计模式。
    看完设计模式,《重构》也是必修课。
    成熟的OOP只有需要时以OOAD原则为基础重构到模式