当前位置:编程学习 > C#/ASP.NET >>

看了半天装饰模式~~~始终不是很明白!忘指点一下



看完装饰设计模式~~~始终不明不白
看了一下人家博客的介绍,在以下情况下应当使用装饰模式:

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

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

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

有3个问题不是很清楚~~`
1。“1”和“2”给我的感觉是~~类的某个对象需要添加额外的逻辑,在Main方法中使用时直接添加需要的逻辑不便于维护,用子类来实现又有点多余。不知道这样理解对吗?

2。现在写的代码还很少不能明白“3”当中的含义~~望大家指点一下.

3。为什么装饰类与被装饰类都要继承同一个接口或抽象类(Component),不继承它不是同样能达到目的吗? --------------------编程问答-------------------- --------------------编程问答-------------------- 不要为了模式而模式,
装饰模式的一个通俗例子是tooltip控件,当你往窗体上拖放一个tooltip(帮助提示)控件时,窗体中的每一个控件都会多出几个tooltip属性来,
就是你说的 :1。需要扩展一个类的功能,或给一个类增加附加责任。
由于tooltip可以删除,所以:2。需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
有时候可以通过子类继承的方式来实现扩展,但没有装饰来的优雅即:3。需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
--------------------编程问答-------------------- 你在设计模式中见过直截了当的“委托”和“事件”么?不妨在先在.net知识里去搞明白。 --------------------编程问答-------------------- 抛出事件通知这谈不上什么“继承”,说它用于替代继承时小题大作了,原因是那些人按照设计模式上的过分繁琐的形式来学,以致产生了幻觉,联想到继承上去了。

比如你要设计一个Grid控件,你不知道当使用这个控件的其它程序员如何扩展Cell的编辑功能,那么你就触发一个“CellEditing”和一个“CellEdited”事件就好了。在.net中,这不需要纠结繁琐的形式。特别是,事件的类型定义是Grid中的职责,并且只需要一句话就定义好了。 --------------------编程问答-------------------- 哦当然,这里不是为了强调事件本身。实际上如果GOF懂得委托和事件的话,那么24和模式也就剩下不足10个,其它的都可以简单地消除了,也就是都是委托和事件的简单应用。

比如你要扩展一个Grid,那么你写了一个自己的MyGrid类,它只是包含一个Grid控件,然后处理了Grid中许多事件,在事件处理方法中去追加你要的处理细节,那么你的这个Grid就看起来很像是Grid,但是细节增加了很多。这是任何一个使用微软开发工具平台里的控件的人都很容易学到的,许多人就是用鼠标往用户控件里拖进一个核心的控件然后编写几百行代码来扩展这个核心控件,最后把这个用户控件当作这个核心控件的所谓新的包装来使用。 --------------------编程问答-------------------- 委托和事件不是观察者模式吗 --------------------编程问答--------------------
引用楼主 now00000 的回复:
看完装饰设计模式~~~始终不明不白
看了一下人家博客的介绍,在以下情况下应当使用装饰模式:

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

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

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

有3个问题不是很清楚~~`
1。“1”和“2”给我的感觉是~~类的某个对象需要……

1.这种情况,实质是改变了接口的内涵。可以通过定义新的接口来解决。
2.也可以通过接口的组合来解决。
3.通过接口的组合来解决。
继承是oo发展初期想象出来的一种场景。实际应用中,发生概率极低,尤其是单根继承。实际上对象中的关系通常都是相同中有着不同。组合代替继承。
一个类可以实现多个接口。通过接口加上委托,可以解决很多问题。 --------------------编程问答-------------------- 很好,很强大,需要好好研究 --------------------编程问答-------------------- 推荐lz《大话设计模式》这本书 --------------------编程问答--------------------
引用 3 楼 sp1234 的回复:
你在设计模式中见过直截了当的“委托”和“事件”么?不妨在先在.net知识里去搞明白。

这句话很有道理,我最近一个月也在学设计模式,呵呵,但是发现,我刻意的在用设计模式,就像SP说的一样,在设计模式中直截了当的委托和事件。 --------------------编程问答--------------------
引用 9 楼 bourbon1795 的回复:
推荐lz《大话设计模式》这本书

这本书,其实还算不错,我是在msdn下了设计模式的视频,同步进行,讲师是李建忠老师. --------------------编程问答-------------------- 通过一个月的学习,收获挺多,哈哈。 一个设计模式我是反复的去了解,去实践,每一次都有收获! --------------------编程问答--------------------
引用 12 楼 quanpp 的回复:
通过一个月的学习,收获挺多,哈哈。 一个设计模式我是反复的去了解,去实践,每一次都有收获!

设计模式不要乱用。 --------------------编程问答-------------------- 推荐lz《大话设计模式》这本书 --------------------编程问答-------------------- 学设计模式最好先别想怎么套用他们,最重要是领悟设计原则,为什么要这么设计,这些模式是怎么设计出来的。
初学者才会千方百计想着套用设计模式。
看完设计模式,《重构》也是必修课。
成熟的OOP只有需要时以OOAD原则为基础重构到模式 --------------------编程问答-------------------- 就是做大饼

先加鸡蛋,就是鸡蛋饼,再加芝麻,就是芝麻鸡蛋饼
如果先加芝麻,就是芝麻饼,再加鸡蛋就是鸡蛋芝麻饼

如果用子类的话,太多类了,排列组合太复杂了,饼、鸡蛋饼、芝麻鸡蛋饼、芝麻饼、鸡蛋芝麻饼
独立出来
饼,加鸡蛋功能,加芝麻功能,三个类就可以了
继承同一个接口或抽象类,那是当然的了,不然加了鸡蛋后如何加芝麻?不管他们怎么先后加,饼始终应该是饼不能变。

--------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,