Head First Design patterns笔记-Decorator Patterns (从”用不同技能武装自己”看装饰模式)

定义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

评论

#1楼  2007-05-11 09:37 .net开发资源精华收集 [未注册用户]

已引用:
http://dotneturls.com/gb2312/Blogs/20070510/93/Head_First_Design_patterns笔记_Decorator_Patterns_从_用不同技能武装自己_看装饰模式.aspx   回复  引用    

#2楼  2007-05-11 12:21 Oriesmap [未注册用户]

这个例子真的很好。对于装饰模式我以前都看过n遍的例子,但都没有看明白过。
从博主的这个例子,才真象恍然大悟了。
谢谢博主了。   回复  引用    

#3楼  2007-05-11 14:16 yxin1322 [未注册用户]

写得太好了,豁然开朗啊   回复  引用    

#4楼  2007-05-11 14:28 巫云      

有空讨教一下篮球,偶中学也在校队混过的。   回复  引用  查看    

#5楼 [楼主] 2007-05-11 15:35 zhanqiangz(闲云野鹤)      

@Oriesmap
@yxin1322
谢谢!希望我写的东西对大家能有一点用处.

@巫云
兄弟如果在北京可以联系我打球,我一般在北大玩,公司的比赛一般在清华体育馆.   回复  引用  查看    

#6楼  2007-05-11 17:52 picker [未注册用户]

不好意思,本人初学者,对于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方法了?不太懂,请老大你仔细说明下,不要嫌小弟愚钝

  回复  引用    

#7楼  2007-05-11 22:46 Eveong [未注册用户]

@picker
这个用的很的确很巧妙,就是一个递归调用了 。110 的 myself 是 BasketballSkill的实例 而 BasketballSkill(myself)中 myself 是swimmingSkill的实例 依次往上... ...   回复  引用    

#8楼  2007-07-19 15:34 炭炭      

鼓励,例子举得真的是不错,豁然开朗。
有几个问题探讨一下:SkillBase应该是一个抽象类而不应是接口,这样可以把 IHuman _human 的定义放到基类里去。

  回复  引用  查看    

#9楼  2007-12-01 23:40 nihao [未注册用户]

太棒了 加油呀啦啦啦..   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-05-11 09:03 编辑过
 
历史上的今天:

另存  打印
 


<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

公告

如转载本博客的相关资料敬请注明出处.谢谢合作!

与我联系

常用链接

留言簿(6)

我参与的团队

我的标签

随笔分类(51)

随笔档案(49)

文章分类(7)

文章档案(5)

收藏夹(3)

.NET

BizTalk

Design

JavaScript

My Blogs

Power Tools

Process Control

Search Engine

SQL Server

XML

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜