设计模式六大原则_第1页
设计模式六大原则_第2页
设计模式六大原则_第3页
设计模式六大原则_第4页
设计模式六大原则_第5页
免费预览已结束,剩余10页可下载查看

下载本文档

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

文档简介

设计模式六大原作者:zhengzhb发布于2012-11-2,:设计模式六大原则(1):单一职责原问题T个不同的职责:职责P1,P2。当由于职责P1求发生改变而需要修改T可能会导致原本运行正常的职责P2能发生故障。解决方案:遵循单一职责原则。分别建立两T1、T2,T1P1,T2成职责P2当修改类T1会使P2生故障风险;同理,当修改T2不会使职责P1风险。设模式从没有单职责则在软件也自觉遵这一要则为这。在件程中谁不望因修了功能致他的能生故。避现这问的方便遵循一责则。然一原则此单,且认为,PP1和P2。比如T负责一个职责P,这样设计是符合单一职责原则的。后来由于某种原因,也许是需求变更了,也许是程序的设计者境界提高了,需要将职P粒度更细的职责P1,P2,这时如果要使程序遵循单一职T解为两个类T1T2,分别负责P1、P2个职责。但是在程序已经写好的情况下,这样做简直太费时间了。所以,简单的修改类T,用它来负散的不确定性,因为我们不会想到这个职责P,在未来可能会扩P1,P2,P3,P4……Pn。所以举例说明,用一个类描述动物呼吸这个场景mal{publicvoidbreathe(Stringystem.out.println(animal+}}publicublicstaticvoidmain(String[]Animalanimal=animal.breathe("animal.breathe("猪 }猪呼AimalTerestralAuatc,publicvoidbreathe(Stringystem.out.println(animal+"呼吸空气 }class the(String public System.out.println(animal+publicstaticvoidmain(String[]errestrialterrestrial=newerrestrial.breathe(" aquatic.breathe("terrestrial.breathe(Aquaticaquatic 直接修改类Animal然违背了单一职责原则,但花销却小的多,代码如下:classAnimal{publicvoidbreathe(String if(" public publicstaticvoidAnimalanimal=newanimal.breathe(animal.breathe(animal.breathe("鱼 }animal.breathe("Anialbrathemal{publicvoidbreathe(Stringanimal){ publicvoidStringanimal){ publicclass publicstaticvoidmain(String[]nimalanimal=newanimal.breathe("nimal.breathe("animal.breathe("nimal.breathe2("}情况确。我原是:有辑够简,可代码别一责原;有遵循单一职责原的优点有设计模式六大原则(2):里氏替换原这项原则最早是在1988年,由麻省理工学院的一位姓里的(BarbaraLiskov)提出来的。定义1:如果对每一个类型为T1对象o1,都有类型为T2o2,使得以T1义的所有P有的o1代换成o2程序P行为没有发生变化,那么类型T2型T1的子类型。问题由来:有能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中PP1P2功能PAB则B完P2的同时,有可能会导致原有P1解决方案:当使用继承时,遵循里氏替换原则。类B承A添加新的方法完成新增功能P2不要A方法,也尽量不要重载父类A法。举例说明继承的风险,我们需要完成一个两数相减的功能,由类A负责publicintfunc1(inta,intpublicintfunc1(inta,intreturna- public publicstaticvoidmain(String[]a=new System.out.println("100-80="+a.func1(100, }运行结果100-100-后来,我们需要增加一个新的功能:完成两数相加,然后再与100和B负责。即B成两个功能:由于类A经实现了第一个BA,只需要再完成第二个功能就可以xtendsxtendspublicintfunc1(inta,intpublicintfunc2(inta,intreturn public Bb=newnc1(100,publicstaticvoidSystem.out.println("100-System.out.println("100+20+100="+b.func2(100,20));}100-100-我们发现原本运行正常的相减功能发生了错误。原因就是B法起名时无意中重写了父类的方法,造成所有运行相减功能的代码全部调用了类B后的方法,造成原本运行正常的功能出现了错误。在本例中,基类A完成的功能,换成子类B之后,发生了异常。在实际编程包含4含义:设计模式六大原则(3):依赖倒置原问题A赖类B,假如要将类AC,则必须通过修A代码来达成。这种场景下,类A一般是模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假A,会给程序带来不必要的风险。解决方案:将类A为依赖接口IBC自实现接口I,类AI与BC则会大大降低修改类A率ava依赖置则的想是向口程,们旧个例来明面接编程相对publicreturn voidnarrate(Bookystem.out.println("开始讲故事}}publicclassublicstaticvoidmain(String[]Mothermother=mother.narrate(new}}运行结果publicString}return要改Moter能。如以需换换成页?还不地改Moter,Mther与Bok才行。象的接口interfaceinterface publicStringgetContent();Mother接口IReader生依赖关系,而BookNewspaper读物的范畴,他们各自都去IReader这样就符合依赖倒置原则了,代码修改为:spaperimplementsIReader{publicStringgetContent(){ 助尼克斯击败老鹰……";}}classBookimplementsIReader{pu return"很久很久以前有一个的故事……";}classMother{publicvoidnarrate(IReaderystem.out.println("开始讲故事}}publicclassublicstaticvoidmain(String[]Mothermother=mother.narrate(new()); 运行结果林书豪17+9克斯这样改,无以怎样展类都需要改Moter了这只一简单的例,际情中代表块的Mothr将负成主的务逻,旦需对进采用依赖倒置原则给多人并行开发带来了极大的便利,比如上例中,原本Mother与Book类直接耦合时,Mother须等Book编码完成后才可以进行编码,因为Mother赖于Book类。修改后的程序则可以同时开工,互不影MotherBook一点关系也没有。参与协作开发的人越多、项目越庞大,采用依赖导致原则的意义就越重大。现在很流行的TDD是构造方法传递和setter相信用过Spring架的,对依赖的传递方式一定不会陌生在实际编程中,我们一般需要做到如下3依赖倒置原则的就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖置设计模式六大原则(4):接口原上问题AIBCI赖D,如果IAB不是最小接口B类D现他们不需要的方法。解决方案:将臃I的几个接口,类A类C与他们需要的接口建立依赖关系。也就是采用接口原则。举例来说明接口原则(图1未遵循接口原则的设计这个图的意思是A赖I方法12、方3B是对类A赖的实现。类CI1、方法4、5,类DC的实现。对于类B和类D说,I{I{publicvoid publicvoidpublicvoidpublic; class publicvoiddepend1(I publicvoiddepend2(Ii){ voiddepend3(Ii){ classBimplementsI{publicvoidmethod1(){ System.out.println("类B实现接口I的方法 publicvoidmethod2(){ System.out.println("类B实现接口I的方法2"); publicvoidmethod3(){ System.out.println("类B实现接口I的方法3");} //对于类B来说,method4和method5不是必需的,但是由于接口A中有这两个方法, publicvoid classpublic}publicvoiddepend2(Ii){ publicvoiddepend3(Ii){ classDimplementsI{ voidmethod1(){ System.out.println("DI1"); //对于类D来说,method2和method3不是必需的,但是由于接口A中有这两个 publicvoidmethod2(){} publicvoidmethod3(){} voidmethod4(){ System.out.println("类D实现接口I的方法4"); publicvoidmethod5() System.out.println(DI的方法5"); publicclass publicstaticvoidmain(String[] Aa=newA(); a.depend1(newB());a.depend2(new a.depend3(new c=newC(); c.depend1(newD()); c.depend2(newD());c.depend3(newD()); }}中必须实这些法这然不好设如果这设计改符合口原则,必对接口I行拆。这原的口I拆为三接,分后设如图所示:(图2遵循接口原则的设计照例贴出程序的代码,供不熟悉类图的朋友参考eI1eI1;publicvoidmethod1();interfaceI2 publicpublicvoid}interfaceI3publicvoidublicvoidmethod5(); class publicvoiddepend1(I1 publicvoiddepend2(I2i){ publicvoiddepend3(I2 sI1,1publicvoidmethod1()}publicvoidmethod2()ystem.out.println("类B实现接口I2的方法 public{}System.out.println(BI2classpublicvoiddepend1(I1publicvoiddepend2(I3 nd3(I3i){ classDimplementsI1,Iublicvoidmethod1() System.out.println("D}3publicvoidmethod4()}publicvoidmethod5()ystem.out.println("类D实现接口I3的方法 }II接口则的义:建单接,不建庞肿的口尽量化口,口中的方尽少。就说,们为个类立口,不试图建一个庞的供所依它的去用。文子,将个大口变为3个的口所用就口原。在序计中依几接要赖一综的接更活。口设可性。说到里很多会的接原跟之的一原则相,其不。其,单一职原原注的职责而口原注对依赖。其,一职原主约束,次才接和方,针的是序的和细;接口则主约接设计模式六大原则(5)迪米特法则又叫最少知道原则,最早是在1987年由NortheasternUniversity的IanHolland来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public员工classthis.id=id;privateString publicvoidpublicString classthis.id=privateStringd(Stringreturn}publicString 员工classthis.id=id;privateString publicvoidpublicString classthis.id=privateStringd(Stringreturn}publicString mployee> List<SubEmployee>list= for(inti=0;i<100;ubEmployeeemp=newist<Employee>list=newEmployeeemp=newfor(intublicvoidemp.setId("总公司}returnpanyManager}ist<SubEmployee>list1= }return} publicList<Employee>list2=List<Employee>list2= }publicManagere= publicstaticvoidmain(String[] }}}现在这个设计的主要问题出在Manager中,根据迪米特法则,只与直接的朋友发生通信,而SubEmployee类并不是Manager类

温馨提示

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

评论

0/150

提交评论