24种设计模式介绍与6大设计原则_第1页
24种设计模式介绍与6大设计原则_第2页
24种设计模式介绍与6大设计原则_第3页
24种设计模式介绍与6大设计原则_第4页
24种设计模式介绍与6大设计原则_第5页
已阅读5页,还剩331页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

您的设计模式目录第章策略模式【STRATEGYPATTERN】 41第章模式【PROXYPATTERN】 82第章单例模式【SINGLETONPATTERN】 123第章多例模式【MULTITIONPATTERN】 164第章工厂模式【FACTORYMETHODPATTERN】 195第章抽象工厂模式【ABSTRACTFACTORYPATTERN】 316第章门面模式【FACADEPATTERN】 447第章适配器模式【ADAPTERPATTERN】 518第章模板模式【TEMPLATEMETHODPATTERN】 639第章建造者模式【BUILDERPATTERN】 8210第章桥梁模式【BRIDGEPATTERN】 您的设计模式目录第章策略模式【STRATEGYPATTERN】 41第章模式【PROXYPATTERN】 82第章单例模式【SINGLETONPATTERN】 123第章多例模式【MULTITIONPATTERN】 164第章工厂模式【FACTORYMETHODPATTERN】 195第章抽象工厂模式【ABSTRACTFACTORYPATTERN】 316第章门面模式【FACADEPATTERN】 447第章适配器模式【ADAPTERPATTERN】 518第章模板模式【TEMPLATEMETHODPATTERN】 639第章建造者模式【BUILDERPATTERN】 8210第章桥梁模式【BRIDGEPATTERN】 9711第章命令模式【DPATTERN】 11212第章装饰模式【DECORATORPATTERN】 12613第章迭代器模式【ITERATORPATTERN】 13714第章组合模式【COMPOSITEPATTERN】 14715第章观察者模式【OBSERVERPATTERN】 17516第章责任链模式【CHAINOFRESPONSIBILITYPATTERN】 19417第章者模式【VISITORPATTERN】 21018第章状态模式【STATEPATTERN】 23619第章原型模式【PROTOTYPEPATTERN】 25520第章中介者模式【MEDIATORPATTERN】 26821第章解释器模式【INTERPRETERPATTERN】 28622第章亨元模式【FLYWEIGHTPATTERN】 28723第章备忘录模式【MEMENTOPATTERN】 28824第章模式大PK 28925第章六大设计原则 29026单一职责原则【SINGLERESPONSIBILITYPRINCIPLE】 290里氏替换原则【LISKOVSUBSTITUTIONPRINCIPLE】 297第2页您的设计模式依赖倒置原则【DEPENDENCEINVERSIONPRINCIPLE】 309接口 原则【INTERFACESEGREGATIONPRINCIPLE】 310法则【您的设计模式依赖倒置原则【DEPENDENCEINVERSIONPRINCIPLE】 309接口 原则【INTERFACESEGREGATIONPRINCIPLE】 310法则【LOWOFDEMETER】 32026.526.6 开闭原则【OPENPRINCIPLE】 330第27章混编模式讲解 332第28章更新:334相关说明 335相关说明 335第29章后序 336第3页您的设计模式1章给(伴郎)三个锦囊妙计,说是按拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是了夫人又折兵呀,那咱们先看看这个场景是什么样子的。先说这个场景中的要素:计,一个锦囊,一个,妙计是同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用JAVA程序怎么表现这个呢?我们先看类图:计是同一类型的东东,那咱就写个接口:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mglad您的设计模式1章给(伴郎)三个锦囊妙计,说是按拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是了夫人又折兵呀,那咱们先看看这个场景是什么样子的。先说这个场景中的要素:计,一个锦囊,一个,妙计是同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用JAVA程序怎么表现这个呢?我们先看类图:计是同一类型的东东,那咱就写个接口:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*首先定一个策略接口,这是**/老人家给的三个锦囊妙计的接口publicinterfaceIStrategy{//每个锦囊妙计都是一个可执行的算法publicvoidoperate();}第4页您的设计模式然后再写三个实现类,有计嘛:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*找乔 帮忙,使*/不能杀publicclass您的设计模式然后再写三个实现类,有计嘛:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*找乔 帮忙,使*/不能杀publicclassBackDoorimplementsIStrategy{publicvoidoperate(){找乔}帮忙,让给施加");}packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*求*/开个绿灯publicclassGivenGreenLightimplementsIStrategy{publicvoidoperate(){求}开个绿灯,放行!");}packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.孙夫人断后,挡住追兵*/publicclassBlockEnemyimplementsIStrategy{publicvoidoperate(){第5页您的设计模式System.out.println("孙夫人断后,挡住追兵");}}好了,大家看看,计是有了,那需要有个地方放这些妙计呀,放锦囊呀:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemy您的设计模式System.out.println("孙夫人断后,挡住追兵");}}好了,大家看看,计是有了,那需要有个地方放这些妙计呀,放锦囊呀:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassContext{//构造函数,你要使用那个妙计privateIStrategystraegy;publicContext(IStrategystrategy){this.straegy=strategy;}//使用计谋了,看我出招了publicvoidoperate(){this.straegy.operate();}}然后就是雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的爷子去入赘了,嗨,还别说,的计还真是不错,瞅瞅:packagecom.cbf4life.strategy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassZhaoYun{/****/出场了,他根据给他的交代,依次拆开妙计publicstaticvoidmain(String[]Contextcontext;args){第6页您的设计模式//刚刚到吴国的时候拆第一个System.out.println("刚刚到吴国的时候拆第一个 ");contextnewContext(newBackDoor())//拿到妙计context.operate();//拆开执行您的设计模式//刚刚到吴国的时候拆第一个System.out.println("刚刚到吴国的时候拆第一个 ");contextnewContext(newBackDoor())//拿到妙计context.operate();//拆开执行//乐不思蜀了,拆第二个了System.out.println("乐不思蜀了,拆第二个了 ");context=newContext(newGivenGreenLight());context.operate();//执行了第二个锦囊了//的小兵追了,咋办?拆第三个System.out.println("");的小兵追了,咋办?拆第三个context=newContext(newBlockEnemy());context.operate();//孙夫人退兵/**问题来了:实际不知道是那个策略呀,他只知道拆第一个锦囊,*而不知道是BackDoor这个妙计,咋办?似乎这个策略模式已经把计谋名称写出来了*third,没人会说你错!**/}}个不多说了,领会吧。第7页您的设计模式2章什么是模式呢?我很忙,忙的没空理你,那你要找我呢就先找人吧,那人总要知道被人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,人虽然不能干活,但是被的人能干活呀。比如西门庆找,那做,表现在时这样的:先定义一种类型的女人:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定义一种类型的女人,*/和您的设计模式2章什么是模式呢?我很忙,忙的没空理你,那你要找我呢就先找人吧,那人总要知道被人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,人虽然不能干活,但是被的人能干活呀。比如西门庆找,那做,表现在时这样的:先定义一种类型的女人:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定义一种类型的女人,*/和都属于这个类型的女人publicinterfaceKindWomen{//这种类型的女人能做什么事情呢?publicvoidmakeEyesWithMan();//抛媚眼publicvoidhappyWithMan();//happywhat?Youknowthat!}一种类型嘛,那肯定是接口,然后定义:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定一个*/是什么样的人publicclassPanJinLianimplementsKindWomen{publicvoidhappyWithMan(){System.out.println("}在和男人做那个 ");第8页您的设计模式publicvoidmakeEyesWithMan(){System.out.println("抛媚眼");}}再定一个 的:xy;/******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewith您的设计模式publicvoidmakeEyesWithMan(){System.out.println("抛媚眼");}}再定一个 的:xy;/******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.这个人,她太老了,是个男人都看不上,!*/publicclassWangPoimplementsKindWomen{privateKindWomenkindWomen;publicWangPo()//默认的话,是的this.kindWomen=newPanJinLian();}//她可以是KindWomen的任何一个女人的,只要你是这一类型publicWangPo(KindWomenkindWomen){this.kindWomen=kindWomen;}publicvoidhappyWithMan(){this.kindWomen.happyWithMan();// 老了,干不了,可以让年轻的代替}publicvoidmakeEyesWithMan(){this.kindWomen.makeEyesWithMan();//这么大了,谁看她抛媚眼?!}}两个女主角都上场了,男主角也该出现了:第9页您的设计模式xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定义一个西门庆,这*/中饿鬼publicclassXiMenQing{/**水浒里是这样写的:西门庆被*被就开始撮合两人好事,作为的人*收了不少好处费,那我们假设一下:*如果没有您的设计模式xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定义一个西门庆,这*/中饿鬼publicclassXiMenQing{/**水浒里是这样写的:西门庆被*被就开始撮合两人好事,作为的人*收了不少好处费,那我们假设一下:*如果没有*/在中间牵线,这两个不要脸的能成吗?难说的很!publicstaticvoidmain(String[]args){//把 叫出来WangPowangPo=newWangPo();//然后西门庆就说,我要和happy,然后戏:wangPo.makeEyesWithMan();//看到没,虽然表面上wangPo.happyWithMan();}}那这就是活生生的一个例子,通过人实现了某种目的,如果真去掉这个中间环节,直接是西门庆和勾搭,估计很难成就武松杀嫂。那我们再考虑一下,水浒里还有没有这类型的女人?有,的老婆贾氏(就是和那个固管家苟合的那个做她的 :把贾氏素描出来:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassJiaShiimplementsKindWomen{publicvoidhappyWithMan(){System.out.println("贾氏正在Happy中 ");第10页您的设计模式}publicvoidmakeEyesWithMan(){System.out.println("贾氏抛媚眼");}}西门庆勾贾氏:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge您的设计模式}publicvoidmakeEyesWithMan(){System.out.println("贾氏抛媚眼");}}西门庆勾贾氏:xy;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*定义一个西门庆,这*/中饿鬼publicclassXiMenQing{publicstaticvoidmain(String[]args)//改编一下历史,贾氏被西门庆勾走:JiaShijiaShinewJiaShi();{WangPowangPonewWangPo(jiaShi)//让作为贾氏的 人wangPo.makeEyesWithMan();wangPo.happyWithMan();}}活,好,我交给幕后的类去类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥的很,同一个接口呗。第11页您的设计模式3章这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难的对象:的历史上很少出现两个并存的时期,是有,但不多,那我们就认为是个单例模式,在这的,的先看类图:然后我们看程序实现,先定一个:packagecom.cbf4life.singleton1;/******/@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge您的设计模式3章这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难的对象:的历史上很少出现两个并存的时期,是有,但不多,那我们就认为是个单例模式,在这的,的先看类图:然后我们看程序实现,先定一个:packagecom.cbf4life.singleton1;/******/@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.的历史上都是一个朝代一个,有两个 的话,必然要PK出一个出来publicclassEmperor{privatestaticEmperoremperornull;//定义一个放在那里,然后给这个名字privateEmperor(){//世俗和道德约束你,目的就是不让你产生第二个}publicstaticEmperorgetInstance(){第12页您的设计模式if(emperor==null){//如果 还没有定义,那就定一个emperor=newEmperor();}returnemperor;}// 叫什么名字呀publicstaticvoidemperorInfo(){System.out您的设计模式if(emperor==null){//如果 还没有定义,那就定一个emperor=newEmperor();}returnemperor;}// 叫什么名字呀publicstaticvoidemperorInfo(){System.out.println("我就是某某某 ");}}然后定义大臣:packagecom.cbf4life.singleton1;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*大臣是天天要面见*/,见的@SuppressWarnings("all")publicclassMinister{/***@paramargs*/publicstaticvoidmain(String[]args){//第一天Emperoremperor1=Emperor.getInstance();emperor1.emperorInfo();//第一天见的叫什么名字呢?//第二天Emperoremperor2=Emperor.getInstance();Emperor.emperorInfo();//第三天Emperoremperor3=Emperor.getInstance();emperor2.emperorInfo();//三天见的都是同一个人,荣幸吧!}}第13页您的设计模式看到没,大臣天天见到的都是同一个,产生错乱情况,反正都是一个,是好是坏就这一个,只要提到,大家都知道指的是谁,清晰,而又明确。问题是这是通常情况,还有个例的,如同一个时期同一个朝代有两个,怎么办?单例模式很简单,就是在构造函数中多了加一个构造函数,privateB/SHTTPRequestJ2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办?,好,我们写一个通用的单例程序,然后分析一下:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'mglad您的设计模式看到没,大臣天天见到的都是同一个,产生错乱情况,反正都是一个,是好是坏就这一个,只要提到,大家都知道指的是谁,清晰,而又明确。问题是这是通常情况,还有个例的,如同一个时期同一个朝代有两个,怎么办?单例模式很简单,就是在构造函数中多了加一个构造函数,privateB/SHTTPRequestJ2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办?,好,我们写一个通用的单例程序,然后分析一下:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.通用单例模式*/publicclassSingletonPattern{privatestaticSingletonPatternsingletonPattern=null;//限制住不能直接产生一个实例privateSingletonPattern(){}publicSingletonPatterngetInstance(){){ this.singletonPattern=newSingletonPattern(); }returnthis.singletonPattern;}}ABAthis.singletonPatternnewSingletonPattern(0.0010.001Bif(this.singletonPattern==null),你说这个时候这个条件是true还是false?是true,那然后呢?线程BSingletonPattern第14页您的设计模式如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这最的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'm您的设计模式如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这最的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:packagecom.cbf4life.singleton3;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.通用单例模式*/publicclassSingletonPattern{privatestaticfinalSingletonPatternsingletonPattern=newSingletonPattern();//限制住不能直接产生一个实例privateSingletonPattern(){}publicsynchronizedstaticSingletonPatterngetInstance(){returnsingletonPattern;}}newsingletonpattern,getInstance()直接返回给你,解决问题!第15页您的设计模式4章,期间的算不算,不算,各自,各有各的地盘,国号不同。大家还记得《石灰吟》吗?作者是谁?,他是被谁杀死的?镇,对,就是那个在土木堡之变中被瓦刺俘虏的,被俘虏后,他弟弟钰当上了,就是明景帝,估计当上后乐疯了,忘记把老哥 镇削为太上皇了,我Shit,的历2,你说这期间的大臣多郁闷,两个耶,两个精神依附对象呀。(new一个对象没啥差别,不讨论)怎么实现呢,看我出招,先看类图:然后看程序,先把两个定义出来:packagecom.cbf4life.singleton2;importjava.util.ArrayList;importjava.util.Random;/*******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.您的设计模式4章,期间的算不算,不算,各自,各有各的地盘,国号不同。大家还记得《石灰吟》吗?作者是谁?,他是被谁杀死的?镇,对,就是那个在土木堡之变中被瓦刺俘虏的,被俘虏后,他弟弟钰当上了,就是明景帝,估计当上后乐疯了,忘记把老哥 镇削为太上皇了,我Shit,的历2,你说这期间的大臣多郁闷,两个耶,两个精神依附对象呀。(new一个对象没啥差别,不讨论)怎么实现呢,看我出招,先看类图:然后看程序,先把两个定义出来:packagecom.cbf4life.singleton2;importjava.util.ArrayList;importjava.util.Random;/*******@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.的话,必然要PK出一个的历史上都是一个朝代一个 ,有两个出来。问题出来了:如果一个时间,出现了两个怎么办?比如土木堡之变后,被俘虏,明景帝即位,但是明景帝当上!削为太上皇,*也就是在这一个多月的时间内,**/竟然有两个第16页您的设计模式@SuppressWarnings("all")publicclassEmperor{privatestaticintmaxNumOfEmperor2;//最多只能有连个叫什么名字//privatestaticArrayListemperorList=newArrayList(maxNumOfEmperor您的设计模式@SuppressWarnings("all")publicclassEmperor{privatestaticintmaxNumOfEmperor2;//最多只能有连个叫什么名字//privatestaticArrayListemperorList=newArrayList(maxNumOfEmperor);帝的列表;privatestaticintcountNumOfEmperor=0;//正在被人尊称的是那个////先把2个static{//把所有的都产生出来for(inti=0;i<maxNumOfEmperor;i++){emperorList.add(newEmperor("皇"+(i+1)+"帝"));}}//就这么多了,不再推举一个(new一个)privateEmperor(){//世俗和道德约束你,目的就是不让你产生第二个}privateEmperor(Stringinfo){emperorInfoList.add(info);}publicstaticEmperorgetInstance(){Randomrandom=newRandom();countNumOfEmperor=random.nextInt(maxNumOfEmperor);//随机拉出一个,只要是个精神就成return(Emperor)emperorList.get(countNumOfEmperor);}//叫什么名字呀publicstaticvoidemperorInfo(){}}那大臣是比较悲惨了,两个呀,两个老子呀,怎么拜呀,不管了,只要是个就成:packagecom.cbf4life.singleton2;第17页您的设计模式/***@authorcbf4Lifecbf4life@126.comI'mgladtoshareTND,不管了,找到个*/myknowledgewith您的设计模式/***@authorcbf4Lifecbf4life@126.comI'mgladtoshareTND,不管了,找到个*/myknowledgewithyouall.,磕头,请按就成了!@SuppressWarnings("all")publicclassMinister{/***@paramargs*/publicstaticvoidmain(String[]args){intministerNum=10//10个大臣for(inti=0;i<ministerNum;i++){Emperoremperor=Emperor.getInstance();System.out.print("第"+(i+1)+"个大臣emperor.emperorInfo();的是:");}}}那各位看官就可能会不屑了:有的大臣有骨气,只拜一个,你怎么处理?这个问题太简单,第18页您的设计模式5章工厂女娲补天的故事大家都听说过吧,不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人了。这个故事是说,女娲在补了天后,下到凡间一看,,风景,天空是蓝的,清澈的,空气是清新的,,然后就待时间长了就有点寂寞了,没有动物,这些看的到都是静态的东西呀,怎么办?)开始创建人,具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:~~,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,哪!~兹~兹~,一边烤一边,嘿,正正好,Perfect:RB不属此列】(会加上去,之前的会一个一个的补充,目的是让大家舒服,愉悦,就想要,就像是看小说一样,目标,目标而已,能不能实现就看大家给)那这个过程我们就用表现,首先定义一个人类的总称:第19页您的设计模式5章工厂女娲补天的故事大家都听说过吧,不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人了。这个故事是说,女娲在补了天后,下到凡间一看,,风景,天空是蓝的,清澈的,空气是清新的,,然后就待时间长了就有点寂寞了,没有动物,这些看的到都是静态的东西呀,怎么办?)开始创建人,具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:~~,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,哪!~兹~兹~,一边烤一边,嘿,正正好,Perfect:RB不属此列】(会加上去,之前的会一个一个的补充,目的是让大家舒服,愉悦,就想要,就像是看小说一样,目标,目标而已,能不能实现就看大家给)那这个过程我们就用表现,首先定义一个人类的总称:第19页您的设计模式packagecom.cbf4life;/***@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge*/publicinterfaceHuman您的设计模式packagecom.cbf4life;/***@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledge*/publicinterfaceHuman{//首先定义什么是人类withyouall.//人是愉快的,会笑的,本来是想用spublicvoidlaugh();laugh更合适,好长时间没有大笑了;//人类还会哭,代表痛苦publicvoidcry();//人类会说话publicvoidtalk();}然后定义具体的人种:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*黄色人种,这个翻译的*/确,将就点吧publicclassYellowHumanimplementsHuman{publicvoidcry(){黄色人种会哭");}publicvoidlaugh(){黄色人种会大笑,}呀!");publicvoidtalk(){System.out.println("黄色人种会说话,说的字节");第20页您的设计模式}}白色人种:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewith您的设计模式}}白色人种:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.白色人种*/publicclassWhiteHumanimplementsHuman{publicvoidcry(){白色人种会哭");}publicvoidlaugh(){System.out.println("白色人种会大笑,侵略的笑声");}publicvoidtalk(){白色人种会说话,}都是但是单字节!");}黑色人种:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.人的意思,不懂,没跟老外说话*黑色人种,记得*/英语,说blackman是publicclassBlackHumanimplementsHuman{publicvoidcry(){System.out.println("");第21页您的设计模式}publicvoidlaugh(){}");publicvoidtalk(){System.out.println("可以说话,人听不懂");}}人种也定义完毕了,那我们把八卦炉定义出来:packagecom.cbf4life;importjava.util.List;importjava.util.Random;/*****您的设计模式}publicvoidlaugh(){}");publicvoidtalk(){System.out.println("可以说话,人听不懂");}}人种也定义完毕了,那我们把八卦炉定义出来:packagecom.cbf4life;importjava.util.List;importjava.util.Random;/*****@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.讲女娲造人的故事,这个故事梗概是这样的:*很久很久以前,开辟了天地,用身躯造出日月星辰、山川草木,天地一片繁华Oneday,女娲下界走了一遭,哎!太寂寞,太孤独了,没个会笑的、会哭的、会说话的东东(后来这个成了太白金星的宝贝)中烤,就有了人:*我们把这个生产人的过程用Java程序表现出来:*/publicclassHumanFactory{//定一个烤箱,泥巴塞进去,人就出来,这个太先进了publicstaticHumancreateHuman(Classc){Humanhuman=null;//定义一个类型的人类try{human=(Human)Class.forName(c.getName()).newInstance();//产生一个人种}catch(InstationExceptione//你要是不说个人种颜色的话,没法烤,要白的黑,你说话了烤System.out.println("必须指定人种的颜色");...第22页您的设计模式System.out.println("人种定义错误!");catch(ClassNotFoundExceptione//你随便说个人种,我到哪里给你去?!System.out.println("混蛋,你指定的人种找不到!");}return您的设计模式System.out.println("人种定义错误!");catch(ClassNotFoundExceptione//你随便说个人种,我到哪里给你去?!System.out.println("混蛋,你指定的人种找不到!");}returnhuman;}}然后我们再把女娲出来:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/publicclassNvWa{publicstaticvoidmain(String[]args){//女娲第一次造人,试验性质,,火候不足,缺陷System.out.println(" 造出的第一批人是这样的:白人");HumanwhiteHuman=HumanFactory.createHuman(WhiteHuman.class);whiteHuman.cry();whiteHuman.laugh();whiteHuman.talk();//女娲第二次造人,火候加足点,然后又出了个次品,System.out.println("\n\n 的第二批人是这样的:");HumanblackHuman=HumanFactory.createHuman(BlackHuman.class);blackHuman.cry();blackHuman.laugh();blackHuman.talk();//第三批人了,这次火候掌握的正好,黄色人种(不写黄人,免得引起歧义),备注:RB人不属于此列System.out.println("\n\n 造出的第三批人是这样的:黄色人种");第23页您的设计模式HumanyellowHuman=HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk()}}这样就热闹起来了,人也有了,但是这样创建太累了,神仙也会累的,那怎么办?神仙就想了:我塞进去一团泥巴,随机出来一群人,管他是、白人、黄人,只要是人就成(你看看,神仙都偷您的设计模式HumanyellowHuman=HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk()}}这样就热闹起来了,人也有了,但是这样创建太累了,神仙也会累的,那怎么办?神仙就想了:我塞进去一团泥巴,随机出来一群人,管他是、白人、黄人,只要是人就成(你看看,神仙都偷懒,何况是我们人createHuman():packagecom.cbf4life;importjava.util.List;classHumanFactory{//定一个烤箱,泥巴塞进去,人就出来,这个太先进了publicstaticHumancreateHuman(Classc){Humanhuman=null;//定义一个类型的人类第24页您的设计模式try{human(Human)Class.forName(c.getName()).newInstance();//产生一个人种}catch(InstationExceptione//你要是不说个人种颜色的话,没法烤,要白的黑,你说话了烤System.out.println("必须指定人种的颜色"您的设计模式try{human(Human)Class.forName(c.getName()).newInstance();//产生一个人种}catch(InstationExceptione//你要是不说个人种颜色的话,没法烤,要白的黑,你说话了烤System.out.println("必须指定人种的颜色");...System.out.println("人种定义错误!");catch(ClassNotFoundExceptione//你随便说个人种,我到哪里给你去?!System.out.println("混蛋,你指定的人种找不到!");}returnhuman;}//女娲生气了,把一团泥巴塞到八卦炉,哎产生啥人种就啥人种publicstaticHumancreateHuman(){Humanhuman=null;//定义一个类型的人类List<ClassconcreteHumanListClassUtils.getAllClassByInterface(Human.class);//定义了多少人种//八卦炉Randomrandom=newRandom();intrand=random.nextInt(concreteHumanList.size());human=createHuman(concreteHumanList.get(rand));returnhuman;}}然后看女娲是如何做的:packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/第25页您的设计模式publicclassNvWa{publicstaticvoidmain(String[]args){//女娲第一次造人,试验性质,,火候不足,缺陷System.out.println(" 造出的第一批人是这样的:白人您的设计模式publicclassNvWa{publicstaticvoidmain(String[]args){//女娲第一次造人,试验性质,,火候不足,缺陷System.out.println(" 造出的第一批人是这样的:白人");HumanwhiteHuman=HumanFactory.createHuman(WhiteHuman.class);whiteHuman.cry();whiteHuman.laugh();whiteHuman.talk();//女娲第二次造人,火候加足点,然后又出了个次品,System.out.println("\n\n 的第二批人是这样的:");HumanblackHuman=HumanFactory.createHuman(BlackHuman.class);blackHuman.cry();blackHuman.laugh();blackHuman.talk();//第三批人了,这次火候掌握的正好,黄色人种(不写黄人,免得引起歧义),备注:RB人不属于此列System.out.println("\n\n 造出的第三批人是这样的:黄色人种");HumanyellowHuman=HumanFactory.createHuman(YellowHuman.class);yellowHuman.cry();yellowHuman.laugh();yellowHuman.talk();//女娲烦躁了,爱是啥人种就是啥人种,烧吧for(inti=0;i<;i++){System.out.println("\n\n随机产生人种了 "+i);Humanhuman=HumanFactory.createHuman();human.cry();human.laugh();human.talk();}}}第26页您的设计模式哇,packagecom.cbf4life;importjava.io.File;java.io.IOException;.URL;java.util.ArrayList;java.util.List;/***@author您的设计模式哇,packagecom.cbf4life;importjava.io.File;java.io.IOException;.URL;java.util.ArrayList;java.util.List;/***@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyou***/all.@SuppressWarnings("all")publicclassClassUtils{//给一个接口,返回这个接口的所有实现类publicstaticList<Class>getAllClassByInterface(Classc){List<ClassreturnClassListnewArrayList<Class>();//返回结果//如果不是一个接口,则不做处理if(c.isInterface()){StringpackageNamec.getPackage().getName();//获得当前的try{List<Class>allClassgetClasses(packageName);//获得当前包下以//是否是同一个接口for(inti=0;i<allClass.size();i++){if(c.isAssignableFrom(allClass.get(i))){// 是不是一个接口if(!c.equals(allClass.get(i))){//本身不加进去returnClassList.add(allClass.get(i));}}}}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}第27页您的设计模式}returnreturnClassList;}//从一个包中查找出所有的类,在jar包中不能查找privatestaticList<Class>您的设计模式}returnreturnClassList;}//从一个包中查找出所有的类,在jar包中不能查找privatestaticList<Class>getClasses(StringpackageName)throwsClassNotFoundException,IOException{ClassLoaderclassLoader=Th.currentTh ().getContextClassLoader();Stringpath=packageName.replace('.','/');Enumeration<URL>resources=classLoader.getResources(path);List<File>dirs=newArrayList<File>();while(resources.hasMoreElements()){URLresource=resources.nextElement();dirs.add(newFile(resource.getFile()));}ArrayList<Class>classes=newArrayList<Class>();for(Filedirectory:dirs){classes.addAll(findClasses(directory,packageName));}returnclasses;}privatestaticList<Class>findClasses(Filedirectory,StringthrowsClassNotFoundException{List<Class>classes=newArrayList<Class>();if(!directory.exists()){returnclasses;}File[]files=directory.listFiles();for(Filefile:files){if(file.isDirectory()){assert!file.getName().contains(".");classes.addAll(findClasses(file,packageName+"."+file.getName()));}elseif(file.getName().endsWith(".class")){classes.add(Class.forName(packageName+'.'+file.getName().substring(0,file.getName().length()-6)));}}returnclasses;}packageName)第28页您的设计模式}以由父类查找到所有的子类,这个要修改一下,动脑筋想下,简单的很!完整的类图如下:Human了算,简单工厂模式就是这么简单,那我们再引入一个问题:人是有的呀,有男有女,你这怎么没区别,别急,这个且听下回分解!工厂模式还有一个非常重要的应用,就是延迟始化(Lazyinitialization),什么是延迟始化呢?一个对象初始化完毕后就不,等到再次用到得就不用再次初始化了,直接从内存过中拿到就可以了,怎么实现呢,很简单,看例子:packagecom.cbf4life.advance;import您的设计模式}以由父类查找到所有的子类,这个要修改一下,动脑筋想下,简单的很!完整的类图如下:Human了算,简单工厂模式就是这么简单,那我们再引入一个问题:人是有的呀,有男有女,你这怎么没区别,别急,这个且听下回分解!工厂模式还有一个非常重要的应用,就是延迟始化(Lazyinitialization),什么是延迟始化呢?一个对象初始化完毕后就不,等到再次用到得就不用再次初始化了,直接从内存过中拿到就可以了,怎么实现呢,很简单,看例子:packagecom.cbf4life.advance;importjava.util.HashMap;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*/@SuppressWarnings("all")publicclassHumanFactory{//定义一个MAP,初始化过的Human对象都放在这里第29页您的设计模式privatestaticHashMap<String,Human>humans=newHashMap<String,Human>();//定一个烤箱,泥巴塞进去,人就出来,这个太先进了publicstaticHumancreateHuman(Classc){您的设计模式privatestaticHashMap<String,Human>humans=newHashMap<String,Human>();//定一个烤箱,泥巴塞进去,人就出来,这个太先进了publicstaticHumancreateHuman(Classc){;//定义一个类型的人类try{//如果MAP中有,则直接从取出,不用初始化了if(humans.containsKey(c.getSimpleName())){ human=humans.get(c.getSimpleName()); }else{ human=(Human)Class.forName(c.getName()).newInstance(); //放到MAP中 humans.put(c.getSimpleName(),human);}ationExceptione){//你要是不说个人种颜色的话,没法烤,要白的}catch(Inst黑,你说话了烤System.out.println("必须指定人种的颜色");}catch(IllegalAccessExceptione){//一定定义的人种有问题,那就烤不出来了,这是...System.out.println("人种定义错误!");e//你随便说个人种,我到哪里给你去?!System.out.println("混蛋,你指定的人种找不到!");}returnhuman;}}很简单,就加上了黄色那部分的代码,这个在类初始化很消耗资源的情况比较实用,比如你要连接硬减少项目的复杂程度。第30页您的设计模式6章好了,我们继一节课,讲到女娲造人,人是造出来了,世界时热闹了,低头一看,都是清的类型,缺少关爱、、喜怒哀乐等情绪,人类的生命太平淡了,女娲,猛然一拍脑袋,Shit!忘记给人类定义了,那怎么办?抹掉重来,然后就把人类重新洗牌,准备重新开始 人类。怎么改吧,好,有了,给每个人类都加一个,然后再重新,这个问题解决了,那八卦炉怎么办?只有一个呀,要么生产出全性,要不都是女性,那不行呀,有了,把已经有了一条生产线——八卦Factory)拆开,个,并且略加修改,就成了女性八卦炉(只生产女性,一个具体工厂的实现类)和男性八卦炉(只生产男性,又一个具体工厂的实现类先看人类(也就是)的类图:其中三个抽象类在抽象工厂模式中是叫做等级,六个实现类是叫做族,这个也比较好理解,实现类嘛是真实的,一个叫,多了就叫族,然后再看工厂类:第31页您的设计模式6章好了,我们继一节课,讲到女娲造人,人是造出来了,世界时热闹了,低头一看,都是清的类型,缺少关爱、、喜怒哀乐等情绪,人类的生命太平淡了,女娲,猛然一拍脑袋,Shit!忘记给人类定义了,那怎么办?抹掉重来,然后就把人类重新洗牌,准备重新开始 人类。怎么改吧,好,有了,给每个人类都加一个,然后再重新,这个问题解决了,那八卦炉怎么办?只有一个呀,要么生产出全性,要不都是女性,那不行呀,有了,把已经有了一条生产线——八卦Factory)拆开,个,并且略加修改,就成了女性八卦炉(只生产女性,一个具体工厂的实现类)和男性八卦炉(只生产男性,又一个具体工厂的实现类先看人类(也就是)的类图:其中三个抽象类在抽象工厂模式中是叫做等级,六个实现类是叫做族,这个也比较好理解,实现类嘛是真实的,一个叫,多了就叫族,然后再看工厂类:第31页您的设计模式createHuman,目的是简化实现类的代码工作量,这个在讲代码的时候会说。这里还使用了Jdk1.5的一个新特性Enum类型,其实这个完全可以类的静态变量来实现,但我的知识点吧,我希望给大家讲解,每次的提出来,每个人都会有一点的收获就足够了,然后在具体的项目中使用时,知道有这个baidu续类图,完整的类图如下,这个看不大清楚,其实就是上面那两个类图加起来,大家可以看源码中的那个您的设计模式createHuman,目的是简化实现类的代码工作量,这个在讲代码的时候会说。这里还使用了Jdk1.5的一个新特性Enum类型,其实这个完全可以类的静态变量来实现,但我的知识点吧,我希望给大家讲解,每次的提出来,每个人都会有一点的收获就足够了,然后在具体的项目中使用时,知道有这个baidu续类图,完整的类图如下,这个看不大清楚,其实就是上面那两个类图加起来,大家可以看源码中的那个类图文件:然后类图讲解完毕,我们来看程序实现:第32页您的设计模式packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.定义一个人类的统称,问题出来了,刚刚定义的时候忘记定义 了*这个重要的问题非修改不可,否则*/publicinterface您的设计模式packagecom.cbf4life;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.定义一个人类的统称,问题出来了,刚刚定义的时候忘记定义 了*这个重要的问题非修改不可,否则*/publicinterfaceHuman{//首先定义什么是人类上太多太多的东西不了//人是愉快的,会笑的,本来是想用spublicvoidlaugh();laugh更合适,好长时间没有大笑了;//人类还会哭,代表痛苦publicvoidcry();//人类会说话publicvoidtalk();//定义publicvoidsex();}crytalk()三个,以AbstractYellowHuman为例:packagecom.cbf4life.yellowHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.*为什么要修改成抽象类呢?要定义*/呀publicabstractclassAbstractYellowHumanimplementsHuman{publicvoidcry(){黄色人种会哭");}第33页您的设计模式publicvoidlaugh(){黄色人种会大笑,}呀!");publicvoidtalk(){System.out.println("黄色人种会说话,说的字节"您的设计模式publicvoidlaugh(){黄色人种会大笑,}呀!");publicvoidtalk(){System.out.println("黄色人种会说话,说的字节");}}代码,大家可以看一下源代码。算了,还是拷贝,反正是 Eclipse白种人的抽象类:packagecom.cbf4life.whiteHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.白色人人种*/publicabstractclassAbstractWhiteHumanimplementsHuman{publicvoidcry(){System.out.println("白色人种会哭");}publicvoidlaugh(){System.out.println("白色人种会大笑,侵略的笑声");}第34页您的设计模式publicvoidtalk(){System.out.println("白色人种会说话,都是但是单字节!");}}黑种人的抽象类:packagecom.cbf4life.blackHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtoshare您的设计模式publicvoidtalk(){System.out.println("白色人种会说话,都是但是单字节!");}}黑种人的抽象类:packagecom.cbf4life.blackHuman;importcom.cbf4life.Human;/**@authorcbf4Lifecbf4life@126.comI'mgladtosharemyknowledgewithyouall.人的意思,不懂,没跟老外说话*黑色人种,记得*/英语,说blackman是publicabstractclassAbstractBlackHumanimplementsHuman{publicvoidcry(){}");publicvoidlaugh(){}");publicvoidtalk(){System.out.println("可以说话,人听不懂");}}三个抽象类都实现完毕了,然后就是些实现类了。其实,你说抽象类放这里有什么意义吗?就是不允new女性黄种人的实现类:packagecom.cbf4life.yellowHuman;第35页您的设计模式/**@authorcbf4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论