随笔分类 -  06.Design Pattern

摘要: 阅读全文
posted @ 2020-02-12 23:34 菩提树下的杨过 阅读(1063) 评论(0) 推荐(1) 编辑
摘要: 阅读全文
posted @ 2018-01-19 11:16 菩提树下的杨过 阅读(5077) 评论(2) 推荐(4) 编辑
摘要:小时候对日本的动画片十分着迷,“圣斗士”是我的最爱;长大后也曾经一度对“海贼王”十分痴迷;大学看武侠小说时,也特别喜欢那种主人公有奇遇的情况:吃到一颗千年异果,然后功夫大增60年...这些个场景都有一个共同点:对象(或系统)会因为一些需求(通常这些需求之间没有任何关联),而扩展自己的功能。具体来说:青铜战士如果有幸能穿上黄金圣衣,不管你是不是黄金圣斗士,在穿上黄金圣衣的那一刻,你就具有黄金圣斗士的能力;海赋王中的人物,如果能吃到一颗奇异果,就能获得特别的能力(比如路飞就是吃了橡胶奇异果);武侠小说中,主角如果不经意间吃下了千年人参,从此功力大增,打遍天下无敌手...ok,下面谈谈如何设计,就拿 阅读全文
posted @ 2010-02-17 18:11 菩提树下的杨过 阅读(832) 评论(0) 推荐(0) 编辑
摘要:场景:如果想模拟windows的开始菜单,分析一下会发现里面的菜单项:有些有子菜单,有些则没有;因此大体可以将菜单类分为二类,设计代码如下:客户端示例调用如下:从功能正确性上讲,上面的示意代码并无大错,但是如果从客户程序上考虑,却发现这样并非最佳实践:客户程序依赖了太多的Menu类细节,客户程序在树型菜单创建完成后,最关心的莫过于如何把菜单完整的显示出来,但上面的代码中为了达到这个目的,却不得不知道子菜单的内部实现(通过Children和类型判断),如果以后菜单类升级,修改了内部构造(比如将Children改成GetChildren),客户程序将被迫重新修改,这时候组合(Composite)模 阅读全文
posted @ 2010-02-16 19:36 菩提树下的杨过 阅读(662) 评论(1) 推荐(0) 编辑
摘要:当一个应用,有着多个维度的变化时,桥模式可将多个维度的变化独立开来(即解耦),最直观的好处就是可有效减少子类的数量。场景:假如我们要开发一个数据程序程序,导出的数据格式暂定为txt,xml,或直接导入到其它数据库(注:导出格式的需要变化,可以理解为功能维度上的变化),而且我们还要让这套程序能运行于多种平台(windows,linux,freebsd,macos...)上,即跨平台运行(注:可支持多平台的需要变化,可理解为平台需求维度上的变化)如果按传统思维:每种格式的导出程序都要对应写出N个版本的实现,如果导出格式数为M,可支持的平台数为N,则最终的子类数目一定在M*N之上,这将导致一个类爆炸 阅读全文
posted @ 2010-02-01 10:33 菩提树下的杨过 阅读(807) 评论(0) 推荐(0) 编辑
摘要:借用terrylee的原话:Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。适配器模式再次体现了“面向接口编程,而非面向实现编程”这一精神。场景:有一个基于数据库的系统,里面的数据库操作就拿最常用的查询来说,主要是用SqlHelper类里的QueryData(string sql)这个方法来处理的,后来意外发现该方法实现上性能并不是最好(或者不能满足新的需要),而这时正好有一个第三方的DbHelper程序集,写得很成熟性能也不错,但唯一不足的是里面的查询方法签名是SelectData(string sql),怎 阅读全文
posted @ 2010-01-29 10:39 菩提树下的杨过 阅读(516) 评论(0) 推荐(0) 编辑
摘要:原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本。(通常是深拷贝的副本)深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例。(当然如果浅拷贝的话,方法就很多了,比如利用MemberwiseClone或反射属性自动赋值都可以)场景:还是游戏场景,就拿三国来说吧,打仗时可能需要小兵若干,每个小兵可能还要骑马...(简单起见其它东东就不提了,比如可能每个小兵还要带兵器若干),这些个实例的数量是动态的,但是几乎每个小兵的属性都完全相同,每匹战马的属性也相同,很显然写一堆的new()造出若干实例,再逐一对属性赋值是可行的,但是并非最好的做法,下面看看 阅读全文
posted @ 2010-01-27 11:18 菩提树下的杨过 阅读(507) 评论(0) 推荐(0) 编辑
摘要:工厂模式:个人理解为主要用于创建"同一系列"的N个对象实例。(注意这里"同一系列"指这一系列对象均继承于某一个抽象类或均实现了某一个接口)举例:(仍然来自李建忠老师webcast中的实例,不过做了些简化)某汽车生产商需要对生产出来的“某一品牌”的不同型号汽车进行测试,于是写一套测试程序,这里的品牌我们就用Audi(奥迪)吧,比如现在测试的是A5,过一阵可能A6要下线,另外A7,A8...也都在研究中...如何让这一套测试程序能应对各种型号的变化,而不是每次出来一款新型号的奥迪,就要发布一个版本?寻找变化点:变化的只是型号,但同一品牌的测试方式却相对不变(比如商务车通常主要侧重于测试商务实用性, 阅读全文
posted @ 2010-01-21 15:59 菩提树下的杨过 阅读(554) 评论(1) 推荐(0) 编辑
摘要:Builder模式主要用于以下场景:需要创建一个较复杂的大对象实例,并且构成该对象的子对象可能经常会发生变化,但是组成大对象的算法却相对稳定。比如:我们做b/s开发时,经常会遇到一些系统要求支持模板/皮肤切换,一个完整的页面由若干子模块组成,不管模板如何变换,子模块的内容/位置如何变化,但组成页面的算法即相对固定。我们假定每个页面由header,body,footer三个基本模块组成,先抽象出来:接口抽象部分Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com 阅读全文
posted @ 2010-01-19 17:41 菩提树下的杨过 阅读(429) 评论(0) 推荐(0) 编辑
摘要:抽象工厂主要用来解决多个系列的对象实例问题。问题的应用场景(来源于李建忠老师的webcast讲座):如果有一款游戏,里面有"道路,房屋,隧道,丛林"这四类基本设施,而且不同的地图(比如中国区,印度区,欧美区)这些设施的风格各有特色,比如中国区应该是中国风格,印度区可能是古典风格,欧美区可能是现代风格...并且这些基本设施的风格还有可能会一直不断增加,作为程序员/架构师,您想如何让以后的维护/升级变得更轻松,比如新增加一种风格时,最好只要改改配置,顺便发个新的dll复制到安装目录就完事,而不是把原来的类似xxx = new ChineseStyleRoad(),全部改成xxx = new New 阅读全文
posted @ 2010-01-19 13:00 菩提树下的杨过 阅读(654) 评论(0) 推荐(0) 编辑
摘要:[代码]Singleton的精髓在于:对于类的实例个数做了限制,只要领会了这一点,可以应用到很多场景,比如聊天室最多只能让100个人进来,数据库连接实例只能有200个... 阅读全文
posted @ 2010-01-18 17:09 菩提树下的杨过 阅读(564) 评论(0) 推荐(0) 编辑
摘要:.NET设计模式开篇——.NET设计模式系列之一Terrylee,2005年12月06日前言加入Design & Pattern团队有几个月的时间了,惭愧的是从没有写过关于设计模式的随笔,得到wayfarer的同意,把企业库系列的随笔放在了团队的首页上。不是不想去写这样的随笔,也不是没有时间,自己初学设计模式,去写设计模式的文章,有点班门弄斧的味道。园子里吕震宇老师... 阅读全文
posted @ 2008-08-05 13:26 菩提树下的杨过 阅读(524) 评论(0) 推荐(0) 编辑
摘要:以下内容转载请注明来自"菩提树下的杨过(http://blog.sqlsky.com)"应用概述:StarBuzz咖啡店有很多饮料,每种饮料都可以根据客户需要加一些调料,比如深培咖啡可以加摩卡(或双倍摩卡),而且某些饮料可以分为大中小杯,根据容量不同,售价不同,而且调料的价格根据饮料的容量不同而不同(比如大杯咖啡加糖要1元,中杯咖啡加糖要0.9元等)又一设计原则:对扩展开放,对修改关闭(本例中各种... 阅读全文
posted @ 2008-05-22 21:28 菩提树下的杨过 阅读(1884) 评论(0) 推荐(0) 编辑
摘要:以下内容转载请注明来自"菩提树下的杨过(http://blog.sqlsky.com)"应用概述:某气象站通过传感器实时测量气温/湿度/压力等数据,要求设计一个系统,能让多种类型的公告栏自动更新这些数据(本例中有二类公告板:实时显示气温/温度公告板,动态统计最高/最低气温公告板)解释:应用观察者模式,把气温数据做为一个主题(也称为可观察者),让其它公告板当做观察者,通过订阅主题(也称通过观察"可观... 阅读全文
posted @ 2008-05-11 22:40 菩提树下的杨过 阅读(808) 评论(0) 推荐(0) 编辑
摘要:以下内容转载请注明来自"菩提树下的杨过(http://blog.sqlsky.com)"把书中开篇duck问题的代码翻译成了c#版:概述:某游戏公司要设计一款鸭子的游戏,里面有各种各样的鸭子,有些会飞,有些会叫,但都会游泳。而且不同种类的鸭子,飞行方式和叫唤的方式各不相同以下代码体现了二个oo原则:1.找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起 2.针对接口编程... 阅读全文
posted @ 2008-05-08 22:43 菩提树下的杨过 阅读(564) 评论(0) 推荐(0) 编辑