定义:Decorator patterns attach additional responsibilities abilities(我自己加的) to an object dynamically, decorators provide a flexible alternative to subclassing for extending functionality.背景介绍:学习是人类与生俱来的一种能力。当然像哭泣、微笑、吃饭、睡觉等能力人一来到这个世界就会。当你学习了一种技能你就会多一种行为能力。用不同的技能把自己武装起来,你就会成为一个”多才多艺”的人,^_^。就我自己而言,吃喝拉撒睡这些就不用再提了,小学四年纪的时候学会了游泳(在同伴当中应该算是学的很晚的),大约六年级的时候开始摸篮球,算起球龄来也差不多15年了,不能算高手中的低手至少也应该算是低手中的高手了(大学的时候也是靠球技迷倒一片的,^_^。稍微自恋一下)。大学修的计算机科学与技术,毕业来北京混饭吃做了一年多的开发。后来走投无路做了一年测试,最后还是脱离了枯燥的测试工作重新做开发。算起来这几项能力我也算都具备了,现在除了做好自己的开发工作,我也会协助同事做一些测试的工作,工作之余我会参加一些游泳,篮球的比赛活动,业余时间教我老婆这几项技能,^_^。这篇文章的例子正是模拟人与技能之间的这种关系,我的一个朋友一直做开发,现在正在学习游泳,基本不会打球,这个例子把他拉进来吧!^_^。VS自动生成的类图:VS自动生成的类图看起来还真不大习惯,下次可能用PD了。^_^。实例代码:
运行结果图:本例引出的面向对象原则:类可以用来扩展,但是不应该被修改。(classes should be open for extension but closed for modification.)此外本例也体现了面向接口编程的思想,在decorator的具体实现中应用了一个IHuman对象,而不是应用ConcreteHuman对象正说明了这一点。如果你想扩展subject的功能,那你就实现自己的decorator就可以,无需修改subject内的任何代码。代码下载:DecoratorDemo.zip后续:装饰模式最最关键的一点是主体(subject)和修饰者(decorator)应该有共同的接口,对于本例而言就是ConcreteHuman 和SkillBase两个类都继承自IHuman这个接口。
posted on 2007-05-10 23:10 zhanqiangz(闲云野鹤) 阅读(2491) 评论(9) 编辑 收藏 所属分类: CSharp 、读书笔记 、Design Patterns
已引用: http://dotneturls.com/gb2312/Blogs/20070510/93/Head_First_Design_patterns笔记_Decorator_Patterns_从_用不同技能武装自己_看装饰模式.aspx 回复 引用
这个例子真的很好。对于装饰模式我以前都看过n遍的例子,但都没有看明白过。 从博主的这个例子,才真象恍然大悟了。 谢谢博主了。 回复 引用
写得太好了,豁然开朗啊 回复 引用
有空讨教一下篮球,偶中学也在校队混过的。 回复 引用 查看
@Oriesmap @yxin1322 谢谢!希望我写的东西对大家能有一点用处. @巫云 兄弟如果在北京可以联系我打球,我一般在北大玩,公司的比赛一般在清华体育馆. 回复 引用 查看
不好意思,本人初学者,对于IHuman myself = new ConcreteHuman(); 106 myself = new DevelopingSkill(myself); 107 myself = new TestingSkill(myself); 108 myself = new SwimmingSkill(myself); 109 myself = new BasketballSkill(myself); 110 myself.Learn(); 这块代码有点疑问,从表面看上去应该只是最终执行这个语句Console.WriteLine("More than 15 years basketball playing experience.");怎么到最后执行了所有技巧类的learn方法了?不太懂,请老大你仔细说明下,不要嫌小弟愚钝 回复 引用
@picker这个用的很的确很巧妙,就是一个递归调用了 。110 的 myself 是 BasketballSkill的实例 而 BasketballSkill(myself)中 myself 是swimmingSkill的实例 依次往上... ... 回复 引用
鼓励,例子举得真的是不错,豁然开朗。 有几个问题探讨一下:SkillBase应该是一个抽象类而不应是接口,这样可以把 IHuman _human 的定义放到基类里去。 回复 引用 查看
太棒了 加油呀啦啦啦.. 回复 引用
Powered by: 博客园 Copyright © zhanqiangz(闲云野鹤)