加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 设计模式之禅

设计模式之禅.pdf(完整版)

设计模式之禅

shane
2010-10-22 0人阅读 举报 0 0 暂无简介

简介:本文档为《设计模式之禅pdf》,可适用于IT/计算机领域

设计模式公司荣誉出品 您的设计模式 我们的设计模式  CBFLIFE 年月    我希望这本书的阅读者具备最基本的代码编写能力您是一个初级的coder,可以从中领会到怎么设计一段优秀的代码您是一个高级程序员可以从中全面了解到设计模式以及Java的边角技术的使用您是一个顶级的系统分析师可以从中获得共鸣寻找到项目公共问题的解决办法呀是不是把牛吹大了! 您的设计模式  目    录  第  章 策略模式【STRATEGY PATTERN】   第  章 代理模式【PROXY PATTERN】   第  章 单例模式【SINGLETON PATTERN】   第  章 多例模式【MULTITION PATTERN】   第  章 工厂方法模式【FACTORY METHOD PATTERN】   第  章 抽象工厂模式【ABSTRACT FACTORY PATTERN】   第  章 门面模式【FACADE PATTERN】   第  章 适配器模式【ADAPTER PATTERN】   第  章 模板方法模式【TEMPLATE METHOD PATTERN】   第  章 建造者模式【BUILDER PATTERN】   第  章 桥梁模式【BRIDGE PATTERN】   第  章 命令模式【COMMAND PATTERN】   第  章 装饰模式【DECORATOR PATTERN】   第  章 迭代器模式【ITERATOR PATTERN】   第  章 组合模式【COMPOSITE PATTERN】   第  章 观察者模式【OBSERVER PATTERN】   第  章 责任链模式【CHAIN OF RESPONSIBILITY PATTERN】   第  章 访问者模式【VISITOR PATTERN】   第  章 状态模式【STATE PATTERN】   第  章 原型模式【PROTOTYPE PATTERN】   第  章 中介者模式【MEDIATOR PATTERN】   第  章 解释器模式【INTERPRETER PATTERN】   第  章 亨元模式【FLYWEIGHT PATTERN】   第  章 备忘录模式【MEMENTO PATTERN】   第  章 模式大PK   第  章 六大设计原则    单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】    里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】    依赖倒置原则【DEPENDENCE  第    页 您的设计模式 INVERSION PRINCIPLE】    接口隔离原则【INTERFACE SEGREGATION PRINCIPLE】    迪米特法则【LOW OF DEMETER】    开闭原则【OPEN CLOSE PRINCIPLE】   第  章 混编模式讲解   第  章 更新记录:   相关说明   相关说明   第  章 后序     第    页 您的设计模式 第  章策略模式【Strategy Pattern】 刘备要到江东娶老婆了走之前诸葛亮给赵云(伴郎)三个锦囊妙计说是按天机拆开解决棘手问题嘿还别说真是解决了大问题搞到最后是周瑜陪了夫人又折兵呀那咱们先看看这个场景是什么样子的。先说这个场景中的要素:三个妙计一个锦囊一个赵云妙计是小亮同志给的妙计是放置在锦囊里俗称就是锦囊妙计嘛那赵云就是一个干活的人从锦囊中取出妙计执行然后获胜用JAVA程序怎么表现这个呢?我们先看类图: 三个妙计是同一类型的东东那咱就写个接口:packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*首先定一个策略接口这是诸葛亮老人家给赵云的三个锦囊妙计的接口**publicinterfaceIStrategy{每个锦囊妙计都是一个可执行的算法publicvoidoperate()}第    页 您的设计模式 然后再写三个实现类有三个妙计嘛:packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*找乔国老帮忙使孙权不能杀刘备*publicclassBackDoorimplementsIStrategy{publicvoidoperate(){Systemoutprintln("找乔国老帮忙让吴国太给孙权施加压力")}} packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*求吴国太开个绿灯*publicclassGivenGreenLightimplementsIStrategy{publicvoidoperate(){Systemoutprintln("求吴国太开个绿灯,放行!")}} packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*孙夫人断后挡住追兵*publicclassBlockEnemyimplementsIStrategy{publicvoidoperate(){第    页 您的设计模式 Systemoutprintln("孙夫人断后挡住追兵")}} 好了大家看看三个妙计是有了那需要有个地方放这些妙计呀放锦囊呀: packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*计谋有了那还要有锦囊*publicclassContext{构造函数你要使用那个妙计privateIStrategystraegypublicContext(IStrategystrategy){thisstraegy=strategy}使用计谋了看我出招了publicvoidoperate(){thisstraegyoperate()}} 然后就是赵云雄赳赳的揣着三个锦囊拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了嗨还别说小亮的三个妙计还真是不错瞅瞅: packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*publicclassZhaoYun{***赵云出场了他根据诸葛亮给他的交代依次拆开妙计*publicstaticvoidmain(Stringargs){Contextcontext第    页 您的设计模式 刚刚到吴国的时候拆第一个Systemoutprintln("刚刚到吴国的时候拆第一个")context=newContext(newBackDoor())拿到妙计contextoperate()拆开执行Systemoutprintln("nnnnnnnn")刘备乐不思蜀了拆第二个了Systemoutprintln("刘备乐不思蜀了拆第二个了")context=newContext(newGivenGreenLight())contextoperate()执行了第二个锦囊了Systemoutprintln("nnnnnnnn")孙权的小兵追了咋办?拆第三个Systemoutprintln("孙权的小兵追了咋办?拆第三个")context=newContext(newBlockEnemy())contextoperate()孙夫人退兵Systemoutprintln("nnnnnnnn")**问题来了:赵云实际不知道是那个策略呀他只知道拆第一个锦囊*而不知道是BackDoor这个妙计咋办?似乎这个策略模式已经把计谋名称写出来了**错!BackDoor、GivenGreenLight、BlockEnemy只是一个代码你写成first、second、third没人会说你错!**策略模式的好处就是:体现了高内聚低耦合的特性呀缺点嘛这个那个我回去再查查*}} 就这三招搞的周郎是“陪了夫人又折兵”呀!这就是策略模式高内聚低耦合的特点也表现出来了还有一个就是扩展性也就是OCP原则策略类可以继续增加下去只要修改Contextjava就可以了这个不多说了自己领会吧。 第    页 您的设计模式 第  章代理模式【Proxy Pattern】 什么是代理模式呢?我很忙忙的没空理你那你要找我呢就先找我的代理人吧那代理人总要知道被代理人能做哪些事情不能做哪些事情吧那就是两个人具备同一个接口代理人虽然不能干活但是被代理的人能干活呀。比如西门庆找潘金莲那潘金莲不好意思答复呀咋办找那个王婆做代理表现在程序上时这样的:先定义一种类型的女人:packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定义一种类型的女人王婆和潘金莲都属于这个类型的女人*publicinterfaceKindWomen{这种类型的女人能做什么事情呢?publicvoidmakeEyesWithMan()抛媚眼publicvoidhappyWithMan()happywhatYouknowthat!} 一种类型嘛那肯定是接口然后定义潘金莲: packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定一个潘金莲是什么样的人*publicclassPanJinLianimplementsKindWomen{publicvoidhappyWithMan(){Systemoutprintln("潘金莲在和男人做那个")}第    页 您的设计模式 publicvoidmakeEyesWithMan(){Systemoutprintln("潘金莲抛媚眼")}} 再定一个丑陋的王婆: packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*王婆这个人老聪明了她太老了是个男人都看不上*但是她有智慧有经验呀她作为一类女人的代理!*publicclassWangPoimplementsKindWomen{privateKindWomenkindWomenpublicWangPo(){默认的话是潘金莲的代理thiskindWomen=newPanJinLian()}她可以是KindWomen的任何一个女人的代理只要你是这一类型publicWangPo(KindWomenkindWomen){thiskindWomen=kindWomen}publicvoidhappyWithMan(){thiskindWomenhappyWithMan()自己老了干不了可以让年轻的代替}publicvoidmakeEyesWithMan(){thiskindWomenmakeEyesWithMan()王婆这么大年龄了谁看她抛媚眼?!}} 两个女主角都上场了男主角也该出现了: 第    页 您的设计模式 packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定义一个西门庆这人色中饿鬼*publicclassXiMenQing{**水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道痴迷了*被王婆看到了,就开始撮合两人好事王婆作为潘金莲的代理人*收了不少好处费那我们假设一下:*如果没有王婆在中间牵线这两个不要脸的能成吗?难说的很!*publicstaticvoidmain(Stringargs){把王婆叫出来WangPowangPo=newWangPo()然后西门庆就说我要和潘金莲happy然后王婆就安排了西门庆丢筷子的那出戏:wangPomakeEyesWithMan()看到没虽然表面上时王婆在做实际上爽的是潘金莲wangPohappyWithMan()}} 那这就是活生生的一个例子通过代理人实现了某种目的如果真去掉王婆这个中间环节直接是西门庆和潘金莲勾搭估计很难成就武松杀嫂事件。那我们再考虑一下水浒里还有没有这类型的女人?有卢俊义的老婆贾氏(就是和那个固管家苟合的那个)这名字起的:“假使”那我们也让王婆做她的代理:把贾氏素描出来: packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*publicclassJiaShiimplementsKindWomen{publicvoidhappyWithMan(){Systemoutprintln("贾氏正在Happy中")第    页 您的设计模式 }publicvoidmakeEyesWithMan(){Systemoutprintln("贾氏抛媚眼")}} 西门庆勾贾氏:packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定义一个西门庆这人色中饿鬼*publicclassXiMenQing{publicstaticvoidmain(Stringargs){改编一下历史贾氏被西门庆勾走:JiaShijiaShi=newJiaShi()WangPowangPo=newWangPo(jiaShi)让王婆作为贾氏的代理人wangPomakeEyesWithMan()wangPohappyWithMan()}} 说完这个故事那额总结一下代理模式主要使用了Java的多态干活的是被代理类代理类主要是接活你让我干活好我交给幕后的类去干你满意就成那怎么知道被代理类能不能干呢?同根就成大家知根知底你能做啥我能做啥都清楚的很同一个接口呗。第    页 您的设计模式 第  章单例模式【Singleton Pattern】 这个模式是很有意思而且比较简单但是我还是要说因为它使用的是如此的广泛如此的有人缘单例就是单一、独苗的意思那什么是独一份呢?你的思维是独一份除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝中国的历史上很少出现两个皇帝并存的时期是有但不多那我们就认为皇帝是个单例模式在这个场景中有皇帝有大臣大臣是天天要上朝参见皇帝的今天参拜的皇帝应该和昨天、前天的一样(过渡期的不考虑别找茬哦)大臣磕完头抬头一看嗨还是昨天那个皇帝单例模式绝对的单例模式先看类图:  然后我们看程序实现先定一个皇帝: packagecomcbflifesingleton***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*中国的历史上一般都是一个朝代一个皇帝有两个皇帝的话必然要PK出一个皇帝出来*publicclassEmperor{privatestaticEmperoremperor=定义一个皇帝放在那里然后给这个皇帝名字privateEmperor(){世俗和道德约束你目的就是不让你产生第二个皇帝}publicstaticEmperorgetInstance(){第    页 您的设计模式 if(emperor==){如果皇帝还没有定义那就定一个emperor=newEmperor()}returnemperor}皇帝叫什么名字呀publicstaticvoidemperorInfo(){Systemoutprintln("我就是皇帝某某某")}} 然后定义大臣: packagecomcbflifesingleton***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*大臣是天天要面见皇帝今天见的皇帝和昨天的前天不一样那就出问题了!*SuppressWarnings("all")publicclassMinister{***paramargs*publicstaticvoidmain(Stringargs){第一天Emperoremperor=EmperorgetInstance()emperoremperorInfo()第一天见的皇帝叫什么名字呢?第二天Emperoremperor=EmperorgetInstance()EmperoremperorInfo()第三天Emperoremperor=EmperorgetInstance()emperoremperorInfo()三天见的皇帝都是同一个人荣幸吧!}}第    页 您的设计模式  看到没大臣天天见到的都是同一个皇帝不会产生错乱情况反正都是一个皇帝是好是坏就这一个只要提到皇帝大家都知道指的是谁清晰而又明确。问题是这是通常情况还有个例的如同一个时期同一个朝代有两个皇帝怎么办?单例模式很简单就是在构造函数中多了加一个构造函数访问权限是private的就可以了这个模式是简单但是简单中透着风险风险?什么风险?在一个BS项目中每个HTTPRequest请求到JEE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办,好,我们写一个通用的单例程序,然后分析一下:packagecomcbflifesingleton***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*通用单例模式*SuppressWarnings("all")publicclassSingletonPattern{privatestaticSingletonPatternsingletonPattern=限制住不能直接产生一个实例privateSingletonPattern(){}publicSingletonPatterngetInstance(){if(thissingletonPattern==){如果还没有实例则创建一个thissingletonPattern=newSingletonPattern()}returnthissingletonPattern}}我们来看黄色的那一部分假如现在有两个线程A和线程B线程A执行到thissingletonPattern=newSingletonPattern()正在申请内存分配可能需要微秒就在这微秒之内线程B执行到if(thissingletonPattern==)你说这个时候这个判断条件是true还是false?是true那然后呢?线程B也往下走于是乎就在内存中就有两个SingletonPattern的实例了看看是不是出问题了?第    页 您的设计模式 如果你这个单例是去拿一个序列号或者创建一个信号资源的时候会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题这才是最要命的!因为这种情况基本上你是重现不了的不寒而栗吧那怎么修改?有很多种方案我就说一种能简单的、彻底解决问题的方案:packagecomcbflifesingleton***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*通用单例模式*SuppressWarnings("all")publicclassSingletonPattern{privatestaticfinalSingletonPatternsingletonPattern=newSingletonPattern()限制住不能直接产生一个实例privateSingletonPattern(){}publicsynchronizedstaticSingletonPatterngetInstance(){returnsingletonPattern}}直接new一个对象传递给类的成员变量singletonpattern你要的时候getInstance()直接返回给你解决问题!第    页 您的设计模式 第  章多例模式【Multition Pattern】 这种情况有没有?有!大点声有没有?有!是确实有就出现在明朝那三国期间的算不算不算各自称帝各有各的地盘国号不同。大家还记得那首诗《石灰吟》吗?作者是谁?于谦他是被谁杀死的?明英宗朱祁镇对就是那个在土木堡之变中被瓦刺俘虏的皇帝被俘虏后他弟弟朱祁钰当上了皇帝就是明景帝估计当上皇帝后乐疯了忘记把老哥朱祁镇削为太上皇了我Shit在中国的历史上就这个时期是有个皇帝你说这期间的大臣多郁闷两个皇帝耶两个精神依附对象呀。这个场景放到我们设计模式中就是叫有上限的多例模式(没上限的多例模式太容易了和你直接new一个对象没啥差别不讨论)怎么实现呢看我出招先看类图:  然后看程序先把两个皇帝定义出来:packagecomcbflifesingletonimportjavautilArrayListimportjavautilRandom***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*中国的历史上一般都是一个朝代一个皇帝有两个皇帝的话必然要PK出一个皇帝出来。*问题出来了:如果真在一个时间中国出现了两个皇帝怎么办?比如明朝土木堡之变后*明英宗被俘虏明景帝即位但是明景帝当上皇帝后乐疯了竟然忘记把他老哥明英宗削为太上皇*也就是在这一个多月的时间内中国竟然有两个皇帝!**第    页 您的设计模式 SuppressWarnings("all")publicclassEmperor{privatestaticintmaxNumOfEmperor=最多只能有连个皇帝privatestaticArrayListemperorInfoList=newArrayList(maxNumOfEmperor)皇帝叫什么名字privatestaticArrayListemperorList=newArrayList(maxNumOfEmperor)装皇帝的列表privatestaticintcountNumOfEmperor=正在被人尊称的是那个皇帝先把个皇帝产生出来static{把所有的皇帝都产生出来for(inti=i<maxNumOfEmperori){emperorListadd(newEmperor("皇"(i)"帝"))}}就这么多皇帝了不允许再推举一个皇帝(new一个皇帝)privateEmperor(){世俗和道德约束你目的就是不让你产生第二个皇帝}privateEmperor(Stringinfo){emperorInfoListadd(info)}publicstaticEmperorgetInstance(){Randomrandom=newRandom()countNumOfEmperor=randomnextInt(maxNumOfEmperor)随机拉出一个皇帝只要是个精神领袖就成return(Emperor)emperorListget(countNumOfEmperor)}皇帝叫什么名字呀publicstaticvoidemperorInfo(){Systemoutprintln(emperorInfoListget(countNumOfEmperor))}}那大臣是比较悲惨了两个皇帝呀两个老子呀怎么拜呀不管了只要是个皇帝就成: packagecomcbflifesingleton第    页 您的设计模式 ***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*大臣们悲惨了一个皇帝都伺候不过来了现在还来了两个个皇帝*TND不管了找到个皇帝磕头请按就成了!*SuppressWarnings("all")publicclassMinister{***paramargs*publicstaticvoidmain(Stringargs){intministerNum=个大臣for(inti=i<ministerNumi){Emperoremperor=EmperorgetInstance()Systemoutprint("第"(i)"个大臣参拜的是:")emperoremperorInfo()}}} 那各位看官就可能会不屑了:有的大臣可是有骨气只拜一个真神你怎么处理?这个问题太简单懒的详细回答你getInstance(param)是不是就解决了这个问题?!自己思考太Easy了。第    页 您的设计模式 第  章工厂方法模式【Factory Method Pattern】 女娲补天的故事大家都听说过吧今天不说这个说女娲创造人的故事可不是“造人”的工作这个词被现代人滥用了。这个故事是说女娲在补了天后下到凡间一看哇塞风景太优美了天空是湛蓝的水是清澈的空气是清新的太美丽了然后就待时间长了就有点寂寞了没有动物这些看的到都是静态的东西呀怎么办?别忘了是神仙呀没有办不到的事情于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人具体过程是这样的:先是泥巴捏然后放八卦炉里烤再扔到地上成长但是意外总是会产生的:第一次烤泥人兹兹兹兹~~感觉应该熟了往地上一扔biu~一个白人诞生了没烤熟!第二次烤泥人兹兹兹兹兹兹兹兹~~上次都没烤熟这次多烤会儿往地上一扔嘿熟过头了黑人哪!第三次烤泥人兹~兹~兹~一边烤一边看着嘿正正好Perfect!优品黄色人类!【备注:RB人不属此列】这个过程还是比较有意思的先看看类图:(之前在论坛上有兄弟建议加类图和源文件以后的模式都会加上去之前的会一个一个的补充目的是让大家看着舒服看着愉悦看着就想要就像是看色情小说一样目标目标而已能不能实现就看大家给我的信心了) 那这个过程我们就用程序来表现首先定义一个人类的总称: 第    页 您的设计模式 packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定义一个人类的统称*publicinterfaceHuman{首先定义什么是人类人是愉快的会笑的本来是想用smile表示想了一下laugh更合适好长时间没有大笑了publicvoidlaugh()人类还会哭代表痛苦publicvoidcry()人类会说话publicvoidtalk()} 然后定义具体的人类:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*黄色人类这个翻译的不准确将就点吧*publicclassYellowHumanimplementsHuman{publicvoidcry(){Systemoutprintln("黄色人类会哭")}publicvoidlaugh(){Systemoutprintln("黄色人类会大笑幸福呀!")}publicvoidtalk(){Systemoutprintln("黄色人类会说话一般说的都是双字节")第    页 您的设计模式 }} 白色人类: packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*白色人类*publicclassWhiteHumanimplementsHuman{publicvoidcry(){Systemoutprintln("白色人类会哭")}publicvoidlaugh(){Systemoutprintln("白色人类会大笑侵略的笑声")}publicvoidtalk(){Systemoutprintln("白色人类会说话一般都是但是单字节!")}} 黑色人类: packagecomcbflife***authorcbfLifecbflifecom*I'mgladt

用户评价(7)

  • 10.44.7.248 好个毛线,里面内容和设计模式之禅书不相符合,根本不是设计模式之禅

    2013-05-01 20:26:14

  • kofcy 下来看看

    2012-12-19 00:28:04

  • qiuhuayang1984 这个资料相当有用啊

    2012-10-26 22:13:16

  • 183.1.161.220 非常好,非常感谢楼主的分享. 有得电子版的看就非常不错了 还想要纸版的电子版啊....

    2012-06-09 18:14:43

  • 183.1.161.220 非常好,非常感谢楼主的分享.

    2012-06-09 18:05:13

点击加载更多内容
关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/49

设计模式之禅

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利