建造者模式.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
建造者模式

????? 首先我们分析一下需求,奔驰、宝马都是一个产品,他们有共有的属性,牛叉公司关心的是单个模型的运行过程:奔驰模型A是先有引擎声音,然后再响喇叭;奔驰 模型B是先启动起来,然后再有引擎声音,这才是牛叉公司要关心的,那到我们老大这边呢,就是满足人家的要求,要什么顺序就立马能产生什么顺序的模型出来, 我就负责把老大的要求实现出来,而且还要是批量的,也就是说牛叉公司下单订购宝马A车模,我们老大马上就找我“生产一个这样的车模,启动完毕后,喇叭响一 下”,然后我们就准备开始批量生产这些模型。由我生产出N多个奔驰和宝马车辆模型,这些车辆模型的都有run()方法,但是具体到每一个模型的run() 方法中间的执行任务的顺序是不同的,老大说要啥顺序,我就给啥顺序,最终客户买走后只能是既定的模型。好,需求还是比较复杂,我们先一个一个的解决,先从 找一个最简单的切入点——产品类,每个车都是一个产品,如图11-1所示。 图11-1 汽车模型类图 ????? 类图比较简单,在CarModel中我们定义了一个setSequence方法,车辆模型的这几个动作要如何排布,是在这个ArrayList中定义的, 然后run()方法根据sequence定义的顺序完成指定的顺序动作,与我们上一章节介绍的模板方法模式是不是非常类似?好,我们先看CarModel 源代码,如代码清单11-1所示。 代码清单11-1 车辆模型的抽象类 ?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263publicabstractclassCarModel { ?//这个参数是各个基本方法执行的顺序 ?privateArrayListString sequence = newArrayListString(); ?//模型是启动开始跑了 ?protectedabstractvoidstart(); ?//能发动,那还要能停下来,那才是真本事 ?protectedabstractvoidstop(); ?//喇叭会出声音,是滴滴叫,还是哔哔叫 ?protectedabstractvoidalarm(); ?//引擎会轰隆隆地响,不响那是假的 ?protectedabstractvoidengineBoom(); ?//那模型应该会跑吧,别管是人推的,还是电力驱动,总之要会跑 ?final publicvoidrun() { ?//循环一边,谁在前,就先执行谁 ?for(inti=0;ithis.sequence.size();i++){ ?String actionName = this.sequence.get(i); ?if(actionName.equalsIgnoreCase(start)){ ?this.start(); //开启汽车 ?}elseif(actionName.equalsIgnoreCase(stop)){ ?this.stop(); //停止汽车 ?}elseif(actionName.equalsIgnoreCase(alarm)){ ?this.alarm(); //喇叭开始叫了 ?}elseif(actionName.equalsIgnoreCase(engine boom)){ //如果是engine boom关键字 ?this.engineBoom(); //引擎开始轰鸣 ?} ?} ?} ?//把传递过来的值传递到类内 ?final publicvoidsetSequence(ArrayListString sequence){ ?this.sequence = sequence; ?} ?} CarModel的设计原理是这样的,setSequence方法是允许客户自己设置一个顺序,是要先启动响一下喇叭再跑起来,还是要先响一下喇叭 再启动,对于一个具体的模型永远都固定的,但是对N多个模型就是动态的了。在子类中实现父类的基本方法,run()方法读取sequence,然后遍历 sequence中的字符串,哪个字符串在先,就先执行哪个方法。 两个实现类分别实现父类的基本方法,奔驰模型如代码清单11-2所示。 代码清单11-2 奔驰模型代码 ?123456789101112131415161718192021222324252627publicclassBenzModel extends CarModel { ?protectedvoidalarm() { ?System.out.println(奔驰车的喇叭声音是这个样子的...); ?} ?protectedvoiden

文档评论(0)

me54545 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档