下载

3下载券

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Java设计模式经典搞笑珍藏版

Java设计模式经典搞笑珍藏版.pdf

Java设计模式经典搞笑珍藏版

mosquit521
2011-09-13 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《Java设计模式经典搞笑珍藏版pdf》,可适用于IT/计算机领域

设计模式公司荣誉出品 您的设计模式 我们的设计模式  CBFLIFE 年月    我希望这本书的阅读者具备最基本的代码编写能力您是一个初级的coder,可以从中领会到怎么设计一段优秀的代码您是一个高级程序员可以从中全面了解到设计模式以及Java的边角技术的使用您是一个顶级的系统分析师可以从中获得共鸣寻找到项目公共问题的解决办法呀是不是把牛吹大了! http:pqpqnet设计模式pdf持续更新中第页目目目目录录录录策略模式代理模式单例模式多例模式工厂方法抽象工厂模式门面模式更新记录:相关链接http:pqpqnet设计模式pdf持续更新中第页packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*求吴国太开个绿灯*publicclassGivenGreenLightimplementsIStrategy{publicvoidoperate(){Systemoutprintln("求吴国太开个绿灯,放行!")}}packagecomcbflifestrategy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*孙夫人断后挡住追兵*publicclassBlockEnemyimplementsIStrategy{publicvoidoperate(){Systemoutprintln("孙夫人断后挡住追兵")}}好了大家看看三个妙计是有了那需要有个地方放这些妙计呀放锦囊呀:http:pqpqnet设计模式pdf持续更新中第页代理模式代理模式代理模式代理模式什么是代理模式呢?我很忙忙的没空理你那你要找我呢就先找我的代理人吧那代理人总要知道被代理人能做哪些事情不能做哪些事情吧那就是两个人具备同一个接口代理人虽然不能干活但是被代理的人能干活呀。比如西门庆找潘金莲那潘金莲不好意思答复呀咋办找那个王婆做代理表现在程序上时这样的:先定义一种类型的女人:packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定义一种类型的女人王婆和潘金莲都属于这个类型的女人*publicinterfaceKindWomen{这种类型的女人能做什么事情呢?publicvoidmakeEyesWithMan()抛媚眼publicvoidhappyWithMan()happywhatYouknowthat!}一种类型嘛那肯定是接口然后定义潘金莲:packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定一个潘金莲是什么样的人*publicclassPanJinLianimplementsKindWomen{publicvoidhappyWithMan(){Systemoutprintln("潘金莲在和男人做那个")}http:pqpqnet设计模式pdf持续更新中第页packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定义一个西门庆这人色中饿鬼*publicclassXiMenQing{**水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道痴迷了*被王婆看到了,就开始撮合两人好事王婆作为潘金莲的代理人*收了不少好处费那我们假设一下:*如果没有王婆在中间牵线这两个不要脸的能成吗?难说的很!*publicstaticvoidmain(Stringargs){把王婆叫出来WangPowangPo=newWangPo()然后西门庆就说我要和潘金莲happy然后王婆就安排了西门庆丢筷子的那出戏:wangPomakeEyesWithMan()看到没虽然表面上时王婆在做实际是爽的是潘金莲wangPohappyWithMan()}}那这就是活生生的一个例子通过代理人实现了某种目的如果真去掉王婆这个中间环节直接是西门庆和潘金莲勾搭估计很难成就武松杀嫂事件。那我们再考虑一下水浒里还有没有这类型的女人?有卢俊义的老婆贾氏(就是和那个固管家苟合的那个)这名字起的:“假使”那我们也让王婆做她的代理:把贾氏素描出来:packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*publicclassJiaShiimplementsKindWomen{publicvoidhappyWithMan(){Systemoutprintln("贾氏正在Happy中")http:pqpqnet设计模式pdf持续更新中第页}publicvoidmakeEyesWithMan(){Systemoutprintln("贾氏抛媚眼")}}西门庆勾贾氏:packagecomcbflifeproxy***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*定义一个西门庆这人色中饿鬼*publicclassXiMenQing{publicstaticvoidmain(Stringargs){改编一下历史贾氏被西门庆勾走:JiaShijiaShi=newJiaShi()WangPowangPo=newWangPo(jiaShi)让王婆作为贾氏的代理人wangPomakeEyesWithMan()wangPohappyWithMan()}}说完这个故事那额总结一下代理模式主要使用了Java的多态干活的是被代理类代理类主要是接活你让我干活好我交给幕后的类去干你满意就成那怎么知道被代理类能不能干呢?同根就成大家知根知底你能做啥我能做啥都清楚的很同一个接口呗。http:pqpqnet设计模式pdf持续更新中第页List<Class>returnClassList=newArrayList<Class>()返回结果如果不是一个接口则不做处理if(cisInterface()){StringpackageName=cgetPackage()getName()获得当前的包名try{List<Class>allClass=getClasses(packageName)获得当前包下以及子包下的所有类判断是否是同一个接口for(inti=i<allClasssize()i){if(cisAssignableFrom(allClassget(i))){判断是不是一个接口if(!cequals(allClassget(i))){本身不加进去returnClassListadd(allClassget(i))}}}}catch(ClassNotFoundExceptione){eprintStackTrace()}catch(IOExceptione){eprintStackTrace()}}returnreturnClassList}从一个包中查找出所有的类在jar包中不能查找privatestaticList<Class>getClasses(StringpackageName)throwsClassNotFoundException,IOException{ClassLoaderclassLoader=ThreadcurrentThread()getContextClassLoader()Stringpath=packageNamereplace('','')Enumeration<URL>resources=classLoadergetResources(path)List<File>dirs=newArrayList<File>()while(resourceshasMoreElements()){URLresource=resourcesnextElement()http:pqpqnet设计模式pdf持续更新中第页更新记录更新记录更新记录更新记录::::年月日完成策略模式和代理模式的编写并发布到论坛上年月日完成单例模式和多例模式的编写年月日完成工厂方法编写您的设计模式 *办公电话*publicStringgetOfficeTelNumber(){StringofficeTelNumber=(String)thisofficeInfoget("officeTelNumber")Systemoutprintln(officeTelNumber)returnofficeTelNumber}**员工的名称*publicStringgetUserName(){StringuserName=(String)thisbaseInfoget("userName")Systemoutprintln(userName)returnuserName}}大家看到没?这里有很多的强制类型转换就是(String)这个东西如果使用泛型的话完全就可以避免这个转化这节课啰嗦的太多就不再讲了下次找个时间再讲。这个适配器的作用就是做接口的转换那然后我们再来看看我们的业务是怎么调用的:第    页 您的设计模式 packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*这就是我们具体的应用了比如老板要查所有的的女性信息*publicclassApp{publicstaticvoidmain(Stringargs){没有与外系统连接的时候是这样写的IUserInfoyoungGirl=newUserInfo()老板一想不对呀兔子不吃窝边草还是找人力资源的员工好点IUserInfoyoungGirl=newOuterUserInfo()我们只修改了这一句好从数据库中查到个for(inti=i<i){youngGirlgetMobileNumber()}}}大家看使用了适配器模式只修改了一句话其他的业务逻辑都不用修改就解决了系统对接的问题而且在我们实际系统中只是增加了一个业务类的继承就实现了可以查本公司的员工信息也可以查人力资源公司的员工信息尽量少的修改通过扩展的方式解决了该问题。适配器模式分为类适配器和对象适配器这个区别不大上边的例子就是类适配器那对象适配器是什么样子呢?对象适配器的类图是这个样子滴:第    页 您的设计模式 看到没?和上边的类图就一个箭头的图形的差异一个是继承一个是关联就这么多区别只要把我们上面的程序稍微修改一下就成了类适配器这个大家自己考虑一下简单的很。适配器模式不适合在系统设计阶段采用没有一个系统分析师会在做详设的时候考虑使用适配器模式这个模式使用的主要场景是扩展应用中就像我们上面的那个例子一样系统扩展了不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险。在论坛上有网友建议我加上模式的优缺点这个我是不建议加上去你先掌握了怎么使用然后再想怎么更好的使用而且我想你既然想到了你要使用这个模式肯定是有权衡的吧那这个模式的优缺点是不是由你自己来总结会更好的呢?第    页 您的设计模式 第  章模板方法模式【Template Method Pattern】 周三:我刚刚坐到位置打开电脑准备开始干活。“小三小三叫一下其它同事到会议室开会”老大跑过来吼带着淫笑。还不等大家坐稳老大就开讲了,“告诉大家一个好消息昨天终于把牛叉模型公司的口子打开了要我们做悍马模型虽然是第一个车辆模型但是我们有能力有信心做好我们一定要…(中间省略分钟的讲话如果你听过领导人的讲话这个你应该能够续上)”动员工作做完了那就开始压任务了“这次时间是非常紧张的只有一个星期的时间小三你负责在一个星期的时间把这批万车模(注:车模是车辆模型的意思不是香车美女那个车模)建设完成…”“一个星期?这个…是真做不完要做分析做模板做测试还要考虑扩展性、稳定性、健壮性等时间实在是太少了”还没等老大说完我就急了再不急我的小命就折在上面了!“那这样你只做实现不考虑使用设计模式扩展性等都不用考虑”老大又把我压回去了。“不考虑设计模式?那…”哎领导已经布置任务了那就开始死命的做吧命苦不能怨政府点背不能怪社会呀然后就开始准备动手做在做之前先介绍一下我们公司的背景我们公司是做模型生产的做过桥梁模型、建筑模型、机械模型甚至是一些政府、军事的机密模型这个不能说就是把真实的实物按照一定的比例缩小或放大用于试验、分析、量化或者是销售等等上面提到的牛叉模型公司专门销售车辆模型的公司自己不生产我们公司是第一次从牛叉模型公司接单那我怎么着也要把活干好可时间很紧张呀怎么办?既然领导都说了不考虑扩展性那好办我先设计个类图:第    页 您的设计模式 非常简单的实现你要悍马模型我就给你悍马模型先写个抽象类然后两个不同型号的模型实现类那我们把这个程序实现出来:HummerModel抽象类的程序清单如下:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*HummerModel是悍马车辆模型的意思不是悍马美女车模*publicabstractclassHummerModel{**首先这个模型要能够被发动起来别管是手摇发动还是电力发动反正*是要能够发动起来那这个实现要在实现类里了*publicabstractvoidstart()能发动那还要能停下来那才是真本事publicabstractvoidstop()第    页 您的设计模式 喇叭会出声音是滴滴叫还是哔哔叫publicabstractvoidalarm()引擎会轰隆隆的响不响那是假的publicabstractvoidengineBoom()那模型应该会跑吧别管是人推的还是电力驱动总之要会跑publicabstractvoidrun()}H型号悍马的定义如下:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*悍马车是每个越野者的最爱其中H最接近军用系列*publicclassHummerHModelextendsHummerModel{Overridepublicvoidalarm(){Systemoutprintln("悍马H鸣笛")}OverridepublicvoidengineBoom(){Systemoutprintln("悍马H引擎声音是这样在")}Overridepublicvoidstart(){Systemoutprintln("悍马H发动")}Overridepublicvoidstop(){Systemoutprintln("悍马H停车")}*第    页 您的设计模式 *这个方法是很有意思的它要跑那肯定要启动停止了等也就是要调其他方法*Overridepublicvoidrun(){先发动汽车thisstart()引擎开始轰鸣thisengineBoom()然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭thisalarm()到达目的地就停车thisstop()}}然后看悍马H型号的实现:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*H和H有什么差别还真不知道真没接触过悍马*publicclassHummerHModelextendsHummerModel{Overridepublicvoidalarm(){Systemoutprintln("悍马H鸣笛")}OverridepublicvoidengineBoom(){Systemoutprintln("悍马H引擎声音是这样在")}Overridepublicvoidstart(){第    页 您的设计模式 Systemoutprintln("悍马H发动")}Overridepublicvoidstop(){Systemoutprintln("悍马H停车")}**H要跑那肯定要启动停止了等也就是要调其他方法*Overridepublicvoidrun(){先发动汽车thisstart()引擎开始轰鸣thisengineBoom()然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭thisalarm()到达目的地就停车thisstop()}}然后程序写到这里你就看到问题了run方法的实现应该在抽象类上不应该在实现类上好我们修改一下类图和实现:第    页 您的设计模式 就把run方法放到了抽象类中那代码也相应的改变一下先看HummerModeljava:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*HummerModel是悍马车辆模型的意思不是悍马美女车模*publicabstractclassHummerModel{**首先这个模型要能够被发动起来别管是手摇发动还是电力发动反正*是要能够发动起来那这个实现要在实现类里了*publicabstractvoidstart()能发动那还要能停下来那才是真本事publicabstractvoidstop()喇叭会出声音是滴滴叫还是哔哔叫publicabstractvoidalarm()引擎会轰隆隆的响不响那是假的第    页 您的设计模式 publicabstractvoidengineBoom()那模型应该会跑吧别管是人退的还是电力驱动总之要会跑publicvoidrun(){先发动汽车thisstart()引擎开始轰鸣thisengineBoom()然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭thisalarm()到达目的地就停车thisstop()}}下面是HummerHModeljava程序清单:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*悍马车是每个越野者的最爱其中H最接近军用系列*publicclassHummerHModelextendsHummerModel{Overridepublicvoidalarm(){Systemoutprintln("悍马H鸣笛")}OverridepublicvoidengineBoom(){Systemoutprintln("悍马H引擎声音是这样在")}Overridepublicvoidstart(){Systemoutprintln("悍马H发动")第    页 您的设计模式 }Overridepublicvoidstop(){Systemoutprintln("悍马H停车")}}下面是HummerHModeljava的程序清单:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*H和H有什么差别还真不知道真没接触过悍马*publicclassHummerHModelextendsHummerModel{Overridepublicvoidalarm(){Systemoutprintln("悍马H鸣笛")}OverridepublicvoidengineBoom(){Systemoutprintln("悍马H引擎声音是这样在")}Overridepublicvoidstart(){Systemoutprintln("悍马H发动")}Overridepublicvoidstop(){Systemoutprintln("悍马H停车")}}第    页 您的设计模式 类图修改完毕了程序也该好了提交给老大老大一看挺好就开始生产了并提交给客户使用了那客户是如何使用的呢?类图上增加一个Client类就是客户我们这个是用main函数来代替他使用类图如下:然后看增加的Clientjava程序非常的简单:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*客户开始使用这个模型*publicclassClient{publicstaticvoidmain(Stringargs){客户开着H型号出去遛弯了HummerModelh=newHummerHModel()hrun()汽车跑起来了客户开H型号出去玩耍了HummerModelh=newHummerHModel()hrun()}}第    页 您的设计模式 运行的结果如下:悍马H发动悍马H引擎声音是这样在悍马H鸣笛悍马H停车悍马H发动悍马H引擎声音是这样在悍马H鸣笛悍马H停车非常非常的简单那如果我告诉这就是模板方法模式你会不会很不屑呢?就这模式太简单了我一直在使用呀是的你经常在使用但你不知道这是模板方法模式那些所谓的高手就可以很牛X的说“用模板方法模式就可以实现…”你还要很崇拜的看着哇牛人模板方法模式是什么呀然后我们继续回顾我们这个模型回头一想不对呀需求分析的有点问题客户要关心模型的启动停止鸣笛引擎声音吗?他只要在run的过程中听到或看都成了呀暴露那么多的方法干啥?好了我们重新修改一下类图:把抽象类上的四个方法设置为protected访问权限好了既然客户不关心这几个方法而且这四个方法都是由子类来实现的那就设置成protected模式。咦~那还有个缺陷run方法既然子类都不修改那是不是可以设置成final类型呢?是滴是滴,类图如下:第    页 您的设计模式 好了这才是模板方法模式就是这个样子我们只要修改抽象类代码就可以了HummerModeljava程序清单如下:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*HummerModel是悍马车辆模型的意思不是悍马美女车模*publicabstractclassHummerModel{**首先这个模型要能够被发动起来别管是手摇发动还是电力发动反正*是要能够发动起来那这个实现要在实现类里了*protectedabstractvoidstart()能发动那还要能停下来那才是真本事protectedabstractvoidstop()喇叭会出声音是滴滴叫还是哔哔叫protectedabstractvoidalarm()引擎会轰隆隆的响不响那是假的protectedabstractvoidengineBoom()那模型应该会跑吧别管是人退的还是电力驱动总之要会跑第    页 您的设计模式 finalpublicvoidrun(){先发动汽车thisstart()引擎开始轰鸣thisengineBoom()然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭thisalarm()到达目的地就停车thisstop()}}其他的子类都不用修改(如果要修改就是把四个方法的访问权限由public修改protected)大家请看这个run方法他定义了调用其他方法的顺序并且子类是不能修改的这个叫做模板方法start、stop、alarm、engineBoom这四个方法是子类必须实现的而且这四个方法的修改对应了不同的类这个叫做基本方法基本方法又分为三种:在抽象类中实现了的基本方法叫做具体方法在抽象类中没有实现在子类中实现了叫做抽象方法我们这四个基本方法都是抽象方法由子类来实现的还有一种叫做钩子方法这个等会讲。到目前为止这两个模型都稳定的运行突然有一天老大又找到了我“客户提出新要求了那个喇叭想让它响就响你看你设计的模型车子一启动喇叭就狂响赶快修改一下”确实是设计缺陷呵呵不过是我故意的那我们怎么修改呢?看修改后的类图:第    页 您的设计模式 增加一个方法isAlarm()喇嘛要不要响这就是钩子方法(HookMethod)那我们只要修改一下抽象类就可以了:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*HummerModel是悍马车辆模型的意思不是悍马美女车模*publicabstractclassHummerModel{**首先这个模型要能够被发动起来别管是手摇发动还是电力发动反正*是要能够发动起来那这个实现要在实现类里了*protectedabstractvoidstart()能发动那还要能停下来那才是真本事protectedabstractvoidstop()喇叭会出声音是滴滴叫还是哔哔叫protectedabstractvoidalarm()引擎会轰隆隆的响不响那是假的protectedabstractvoidengineBoom()那模型应该会跑吧别管是人推的还是电力驱动总之要会跑第    页 您的设计模式 finalpublicvoidrun(){先发动汽车thisstart()引擎开始轰鸣thisengineBoom()喇嘛想让它响就响不想让它响就不响if(thisisAlarm()){thisalarm()}到达目的地就停车thisstop()}钩子方法默认喇叭是会响的protectedbooleanisAlarm(){returntrue}}钩子方法模式是由抽象类来实现的子类可以重写的H型号的悍马是不会叫的喇叭是个摆设看HummerHModeljava代码:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*H和H有什么差别还真不知道真没接触过悍马*publicclassHummerHModelextendsHummerModel{Overrideprotectedvoidalarm(){Systemoutprintln("悍马H鸣笛")}OverrideprotectedvoidengineBoom(){第    页 您的设计模式 Systemoutprintln("悍马H引擎声音是这样在")}Overrideprotectedvoidstart(){Systemoutprintln("悍马H发动")}Overrideprotectedvoidstop(){Systemoutprintln("悍马H停车")}默认没有喇叭的OverrideprotectedbooleanisAlarm(){returnfalse}}那H型号的模型都没有喇叭就是按了喇叭也没有声音那客户端这边的调用没有任何修改出来的结果就不同我们先看Clientjava程序:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*客户开始使用这个模型*publicclassClient{publicstaticvoidmain(Stringargs){HummerHModelh=newHummerHModel()hrun()H型号的悍马跑起来}}运行的出来的结果是这样的:第    页 您的设计模式 悍马H发动悍马H引擎声音是这样在悍马H停车那H又有所不同了它的喇叭要不要响是由客户来决定其实在类图上已经标明了setAlarm这个方法我们看HummerHModeljava的代码:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*悍马车是每个越野者的最爱其中H最接近军用系列*publicclassHummerHModelextendsHummerModel{privatebooleanalarmFlag=true是否要响喇叭Overrideprotectedvoidalarm(){Systemoutprintln("悍马H鸣笛")}OverrideprotectedvoidengineBoom(){Systemoutprintln("悍马H引擎声音是这样在")}Overrideprotectedvoidstart(){Systemoutprintln("悍马H发动")}Overrideprotectedvoidstop(){Systemoutprintln("悍马H停车")}第    页 您的设计模式 OverrideprotectedbooleanisAlarm(){returnthisalarmFlag}要不要响喇叭是有客户的来决定的publicvoidsetAlarm(booleanisAlarm){thisalarmFlag=isAlarm}}这段代码呢修改了两个地方一是重写了父类的isAlarm()方法一是增加了一个setAlarm方法由调用者去决定是否要这个功能也就是喇叭要不要滴滴答答的响哈哈那我们看看Clientjava的修改:packagecomcbflife***authorcbfLifecbflifecom*I'mgladtosharemyknowledgewithyouall*客户开始使用这个模型*publicclassClient{publicstaticvoidmain(Stringargs){客户开着H型号出去遛弯了HummerHModelh=newHummerHModel()hsetAlarm(true)hrun()汽车跑起来了}}运行的结果如下:悍马H发动悍马H引擎声音是这样在悍马H鸣笛悍马H停车第    页 您的设计模式 看到没这个模型run起来就有声音了那当然把hsetAlarm(false)运行起来喇叭就没有声音了钩子方法的作用就是这样滴。那我们总结一下模板方法模式模板方法模式就是在模板方法中按照一个的规则和顺序调用基本方法具体到我们上面那个例子就是run方法按照规定的顺序(先调用start,然后再调用engineBoom再调用alarm最后调用stop)调用本类的其他方法并且由isAlarm方法的返回值确定run中的执行顺序变更通用类图如下:其中TemplateMethod就是模板方法operation和operation就是基本方法模板方法是通过汇总或排序基本方法而产生的结果集。模板方法在一些开源框架中应用很多它提供了一个抽象类然后开源框架写了一堆子类在《XXXInAction》中就说明了如果你需要扩展功能可以继承了这个抽象类然后修改protected方法再然后就是调用一个类似execute方法就完成你的扩展开发确实是一种简单的模式。初级程序员在写程序的时候经常会问高手“父类怎么调用子类的方法”这个问题很有普遍性反正我是被问过好几回那么父类是否可以调用子类的方法呢?我的回答是能但强烈的、极度的不建议怎么做呢—把子类传递到父类的有参构造中然后调用—使用反射的方式调用你使用了反射还有谁不能调用的?!—父类调用子类的静态方法。这三种都是父类直接调用子类的方法好用不?好用!解决问题了吗?解决了!项目中允许使用不?不允许!我就一直没有搞懂为什么要父类调用子类的方法如果一定要调用子类那为什么要继承它呢?第    页 您的设计模式 搞不懂。其实这个问题可以换个角度去理解在重写了父类部分方法后再调用从父类继承的方法产生不同的结果(而这正是模板方法模式)这是不是也可以理解为父类调用了子类的方法呢?你修改了子类影响了父类的结果模板方法模式就是这样效果。第    页 您的设计模式 第  章建造者模式【Builder Pattern】 又是一个周三快要下班了老大突然又拉住我喜滋滋的告诉我“牛叉公司很满意我们做的模型又签订了一个合同把奔驰、宝马的车辆模型都交给我我们公司制作了不过这次又额外增加了一个新需求:汽车的启动、停止、喇叭声音、引擎声音都有客户自己控制他想什么顺序就什么顺序这个没问题吧”。看着老大殷切的目光我还能说啥肯定的点头“没问题!”加班加点做呗“再苦再累就当自己二百五再难再险就当自己二皮脸与君共勉!”这句话说出了我的心声。那任务是接下来我们怎么做实现呢?首先我们想了奔驰、宝马都是一个产品他们有共有的属性牛叉公司关心的是单个模型奔驰模型A是先有引擎声音然后再启动奔驰模型B呢是先启动起来然后再有引擎声音这才是牛叉公司要关关心的那到我们老大这边呢就是满足人家的要求要什么顺序就立马能产生什么顺序的模型出来我呢就负责把老大的要求实现掉而且还要是批量的看不懂?没关系继续看下去首先由我生产出N多个奔驰和宝马车辆模型这些车辆模型的都有run方法但是具体到每一个模型的run方法可能中间的执行任务的顺序是不同的老大说要啥顺序我就给啥顺序最终客户买走后只能是既定的模型还是没听明白我们继

用户评价(0)

关闭

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

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

提示

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

评分:

/

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利