城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

设计模式七大原则

5月13日 火云谷投稿
  《设计模式七大原则》单一职责原则:
  接口隔离原则:(InterfaceSegregationPrinciple)。
  依赖倒转原则:(DependenceInversionPrinciple)。
  里氏替换原则:LiskovSubstitutionPrinciple。
  开闭原则:OpenClosedPrinciple。
  迪米特原则:(DemeterPrinciple)又叫最少知道原则。
  合成复用原则:compositeResusePrinciple)。
  》》本文首发与公众号》》水啾的Java笔记。本文由本地MD比较直接粘贴而来,不想重新排版,如果发现有排版问题,请评论指出。好困啊、概述1、参考视频
  参考视频:https:www。bilibili。comvideoBV1gJ411X7uN?p6t991。12、设计模式的目的
  目的:代码重用性。可读性。可扩展性。可靠性。使程序呈现高内聚、低耦合的特性。3、设计原则核心思想找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。针对接口编程,而不是针对实现编程。为了交互对象之间的松耦合设计。一、单一职责原则:1、单一职责原则介绍
  单一职责原则:对类来说的,即一个类应该只负责一项职责。如果类A负责两个不同的职责:职责1、职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1、A2。2、代码演示
  案例:交通工具。违法了单一职责原则。packagecn。sj。DesignPatterns。oopPrinciplesSAuthorgzmDate2022313001322:51Version1。0Description:oop七大原则之单一职责原则publicclassSingleResponsibility{publicstaticvoidmain(String〔〕args){VehiclevehiclenewVehicle();以下显然是不合理的。vehicle。run(摩托车);摩托车在公路上跑vehicle。run(轮船);轮船在公路上跑vehicle。run(飞机);飞机在公路上跑}}交通工具类,违法了单一职责原则。应该分解该类。或者增加方法,不同类型工具对应不同的方法classVehicle{publicvoidrun(Stringvehicle){System。out。println(vehicle在公路上跑);}}分解Vehicle类,符合单一职责原则。classRoadvehicle{run。。。}classAirVehicle{run。。。}classWaterVehicle{run。。。}3、注意事项和细节降低类的复杂度,一个类只负责一项职责。提高类的可读性、可维护性。降低变更引起的风险。通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违法单一职责原则:只有类中的方法数量足够少,可以在方法级别保持单一职责原则。二、接口隔离原则:1、基本介绍:
  接口隔离原则(InterfaceSegregationPrinciple)客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
  一张图:
  类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现它们不需要的方法。
  按隔离原则应当这样处理:将接口Interface1拆分为独立的几个接口,类A和类C分别于它们需要的接口建立依赖关系。也就是采用接口隔离原则。2、演示代码
  演示不符合接口隔离原则packagecn。sj。DesignPatterns。oopPrinciplesSeven。interfaceS演示不满足接口隔离原则AuthorgzmDate202240900098:58Version1。0Description:publicclassInterfaceSegregationPrinciple{publicstaticvoidmain(String〔〕args){AanewA();Interface1interface1BnewB();a。depend1(interface1B);a。depend2(interface1B);a。depend3(interface1B);DdnewD();Interface1interface1CnewC();d。depend3(interface1C);d。depend4(interface1C);d。depend5(interface1C);}}interfaceInterface1{voidoperation1();voidoperation2();voidoperation3();voidoperation4();voidoperation5();}classBimplementsInterface1{Overridepublicvoidoperation1(){System。out。println(B种的1方法。);}Overridepublicvoidoperation2(){System。out。println(B种的2方法。);}Overridepublicvoidoperation3(){System。out。println(B种的3方法。);}Overridepublicvoidoperation4(){System。out。println(B种的4方法。);}Overridepublicvoidoperation5(){System。out。println(B种的5方法。);}}classCimplementsInterface1{Overridepublicvoidoperation1(){System。out。println(C种的1方法。);}Overridepublicvoidoperation2(){System。out。println(C种的2方法。);}Overridepublicvoidoperation3(){System。out。println(C种的3方法。);}Overridepublicvoidoperation4(){System。out。println(C种的4方法。);}Overridepublicvoidoperation5(){System。out。println(C种的5方法。);}}A类通过接口interface1依赖(使用)到B类中的1、2、3方法。classA{publicvoiddepend1(Interface1interface1){interface1。operation1();}publicvoiddepend2(Interface1interface1){interface1。operation2();}publicvoiddepend3(Interface1interface1){interface1。operation3();}}D类通过接口interface1依赖(使用)到C类中的3、4、5方法。classD{publicvoiddepend4(Interface1interface1){interface1。operation4();}publicvoiddepend5(Interface1interface1){interface1。operation5();}publicvoiddepend3(Interface1interface1){interface1。operation3();}}
  改进为符合接口隔离原则:将接口1拆分。
  三、依赖倒转原则:1、基本介绍
  依赖倒转原则(DependenceInversionPrinciple),也叫依赖倒置原则,是指:高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。依赖倒转(倒置)的中心思想是面向接口编程依赖倒装原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定得多。以抽象为基础搭建的架构比以细节为基础的架构要稳定得多。在java中,抽象指的是接口或抽象类,细节就是具体地实现类。使用接口或抽象类的目的是指定好规范,而不涉及任何具体的操作,把展现细节的任务交给它们的实现类去完成。2、代码演示packagecn。sj。DesignPatterns。oopPrinciplesS演示不符合依赖倒转原则AuthorgzmDate2022409000910:52Version1。0Description:publicclassDependenceInversion{publicstaticvoidmain(String〔〕args){System。out。println(方式1,不符合依赖倒转原则);Person1person1newPerson1();person1。receive(newEmail1());方式1不符合依赖倒转原则的电子右键信息System。out。println();System。out。println(方式2,符合依赖倒转原则);Person2person2newPerson2();person2。receive(newEmail2());方式2,符合依赖倒转原则的电子右键person2。receive(newWeXin());方式2,符合依赖倒转原则的微信}}classEmail1{publicStringgetInfo(){return方式1不符合依赖倒转原则的电子右键信息;}}方式1,比较简单,但是不稳定。如果要接受信息的来源是微信或者短信,那么Person也要增加响应的方法。classPerson1{publicvoidreceive(Email1email){System。out。println(email。getInfo());}}方式2,引入一个接口IReceive,类Person2与接口IReceive发生依赖。Email、WeXin等各自实现IReceive接口。interfaceIReceive{StringgetInfo();}classEmail2implementsIReceive{OverridepublicStringgetInfo(){return方式2,符合依赖倒转原则的电子右键;}}classWeXinimplementsIReceive{OverridepublicStringgetInfo(){return方式2,符合依赖倒转原则的微信;}}classPerson2{publicvoidreceive(IReceiveiReceive){System。out。println(iReceive。getInfo());}}3、依赖关系传递的三种方式3。1接口传递接口传递开关的接口interfaceIOpenAndClose{publicvoidopen(ITVtv);抽象方法,接收接口}ITV接口interfaceITV{publicvoidplay();}实现接口classOpenAndCloseImplimplementsIOpenAndClose{publicvoidopen(ITVtv){tv。play();}}3。2构造方法传递packagecn。sj。DesignPatterns。oopPrinciplesS构造方法传递AuthorgzmDate2022409000911:32Version1。0Description:publicclassThreeTypesDependencies{publicstaticvoidmain(String〔〕args){OpenAndCloseImplopenAndClosenewOpenAndCloseImpl(newITV(){Overridepublicvoidplay(){System。out。println(开关接口);}});openAndClose。open();}}开关的接口interfaceIOpenAndClose{publicvoidopen();}ITV接口interfaceITV{publicvoidplay();}实现接口classOpenAndCloseImplimplementsIOpenAndClose{privateITVpublicOpenAndCloseImpl(ITVtv){this。}publicvoidopen(){tv。play();System。out。println(构造方法传递);}}3。3setter方式传递通过setter方式传递开关的接口interfaceIOpenAndClose{publicvoidopen();publicvoidsetTv(ITVtv);}ITV接口interfaceITV{publicvoidplay();}实现接口classOpenAndCloseImplimplementsIOpenAndClose{privateITVpublicvoidsetTv(ITVtv){this。}publicvoidopen(){tv。paly();}}4依赖倒转原则的注意事项和细节底层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好。变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化。FuobjnewnewZi。继承时遵循里斯替换原则。四、里氏替换原则:1、OOP中的继承性的思考和说明继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范,虽然它不能强制要求所有的子类必须遵循这些规范,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到的子类的功能都有可能产生故障。那么在继承中,如何正确的使用击沉?》里氏替换原则。2、里氏替换原则介绍里氏替换原则,LiskovSubstitutionPrinciple。如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类地对象。在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。继承实际上让两个类的耦合性增强了,在适当的情况下,可以通过聚合、组合、依赖来解决问题。3、代码演示
  一个没有遵循里斯替换原则的代码packagecn。sj。DesignPatterns。oopPrinciplesS一个没有遵循里氏替换原则的例子AuthorgzmDate2022411001122:03Version1。0publicclassNoLisKov{publicstaticvoidmain(String〔〕args){AanewA();System。out。println(113a。fun1(11,3));System。out。println(129a。fun1(12,8));BbnewB();System。out。println(113b。fun1(11,3));System。out。println(129b。fun1(12,8));System。out。println(1139b。fun2(11,3));}}classA{publicintfun1(intnum1,intnum2){returnnum1num2;}}classBextendsA{publicintfun1(inta,intb){}publicintfun2(inta,intb){returnfun1(a,b)9;}}
  修改为遵循里氏替换原则的代码:packagecn。sj。DesignPatterns。oopPrinciplesS说明:一个遵循了里氏替换原则的例子B类不要继承A类,而是采用组合、集合、依赖。AuthorgzmDate2022411001122:29Version1。0publicclassIsLisKov{因为B类不再继承A类,因此调用者调用方法时就会很明确要调用谁。}classBass{}classA2extendsBass{publicintfun1(intnum1,intnum2){returnnum1num2;}}classB2extendsBass{组合。privatefinalA2a2newA2();publicintfun3(inta,intb){returnthis。a2。fun1(a,b);}publicintfun1(inta,intb){}publicintfun2(inta,intb){returnfun1(a,b)9;}}五、开闭原则:1、基本介绍开闭原则,OpenClosedPrinciple,是编程中最基础、最重要的设计原则。一个程序实体如类,模块和函数应该对扩展开放【对提供方来说的】、对修改关闭【对使用方来说的】。用抽象构建框架,用实现扩展细节。当程序需要变化时,尽量通过扩展程序实体的行为来实现变化,而不是通过修改已有的代码来实现变化。编程中遵循其他原则,以及使用设计模式的目的就是遵循开闭原则。2、代码演示代码1,一个没有遵循开闭原则的例子。
  优点是比较容易理解,简单易操作。
  缺点是违反了设计模式的ocp原则。比如要增加一个图形类,就需要在代码中修改较多的地方。packagecn。sj。DesignPatterns。oopPrinciplesS说明:一个没有遵循开闭原则的例子pAuthorgzmDate2022412001222:27Version1。0publicclassNoOpenClosedPrinciple{publicstaticvoidmain(String〔〕args){GraphicEditorgraphicEditornewGraphicEditor();graphicEditor。drawShape(newRectangle());graphicEditor。drawShape(newCircle());}}这是一个用于绘图的类,使用方。classGraphicEditor{接收Shape对象,然后根据Shape的子类绘出不同的图形。publicvoiddrawShape(Shapeshape){if(shape。mtype1){drawRectangle(shape);}elseif(shape。mtype2){drawCircle(shape);}}publicvoiddrawRectangle(Shapeshape){System。out。println(绘制矩形);}publicvoiddrawCircle(Shapeshape){System。out。println(绘制圆形);}如果要增加新功能比如增加一个新图形,就要大修代码。}基类,提供者之一classShape{}矩形,提供者之一classRectangleextendsShape{Rectangle(){super。mtype1;}}圆形,提供者之一classCircleextendsShape{Circle(){super。mtype2;}}
  改进的思路:把创建Shape类做成抽象类,并提供一个抽象的方法draw方法,让子类去实现即可。这样当我们需要新的图形时,只需要让新的图形类继承Shape,并实现draw方法即可,使用方的代码就不需要修改。packagecn。sj。DesignPatterns。oopPrinciplesS说明:一个遵循开闭原则的例子,是NoOpenClosedPrinciple的改进。pAuthorgzmDate2022412001222:56Version2。0publicclassIsOpenClosedPrinciple{publicstaticvoidmain(String〔〕args){GraphicEditor2graphicEditor2newGraphicEditor2();graphicEditor2。drawShape2(newRectangle2());graphicEditor2。drawShape2(newCircle2());graphicEditor2。drawShape2(newTriangle2());}}这是一个用于绘图的类,使用者。classGraphicEditor2{接收Shape对象,然后根据Shape的子类绘出不同的图形。publicvoiddrawShape2(Shape2shape){shape。draw();}}基类,提供者之一abstractclassShape2{publicabstractvoiddraw();}矩形,提供者之一classRectangle2extendsShape2{Rectangle2(){super。mtype1;}Overridepublicvoiddraw(){System。out。println(实现基类Shape2中的抽象方法绘制了矩形。);}}圆形,提供者之一classCircle2extendsShape2{Circle2(){super。mtype2;}Overridepublicvoiddraw(){System。out。println(实现基类Shape2中的抽象方法绘制了圆形。);}}新增的三角形,提供者之一classTriangle2extendsShape2{Overridepublicvoiddraw(){System。out。println(实现基类Shape2中的抽象方法绘制了三角形。);}}3、开闭原则的细节六、迪米特法则:1、基本介绍一个对象应该对其他对象保持最少的了解。类与类关系越密切,耦合度越大。迪米塔法则(DemeterPrinciple)又叫最少知道原则。即一个类对自己依赖的类知道的越少越好。也就是说,对于依赖的类不管多复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外泄露任何信息。迪米特法则还有个更简单的定义:只与直接的朋友通信。直接的朋友【directFriends】:只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现在成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的朋友不要以局部变量的形式出现在类的内部。2、代码演示
  有一个学校,下属有各个学院和总部,现要求打印出学校总部员工ID和学院员工的id。packagecn。sj。DesignPatterns。oopPrinciplesSimportjava。util。ArrayLimportjava。util。L说明:一个不符合迪米特法则的例子。pAuthorgzmDate2022413001322:17Version1。0publicclassNoDemeterPrinciple{publicstaticvoidmain(String〔〕args){SchoolManagerschoolManagernewSchoolManager();schoolManager。printAllEmployee(newCollegeManager());}}学校总部员工。classEmployee{privateSpublicvoidsetId(Stringid){this。}publicStringgetId(){}}学院员工classCollegeEmployee{privateSpublicvoidsetId(Stringid){this。}publicStringgetId(){}}管理学院员工的管理类。classCollegeManager{publicListCollegeEmployeegetAllEmployee(){返回学院的所有员工。ListCollegeEmployeelistnewArrayListCollegeEmployee();for(inti0;i10;i){CollegeEmployeeempnewCollegeEmployee();emp。setId(学院员工idi);list。add(emp);}}}学校管理类classSchoolManager{publicListEmployeegetAllEmployee(){ListEmployeelistnewArrayListEmployee();for(inti0;i5;i){EmployeeempnewEmployee();emp。setId(学校总部员工idi);list。add(emp);}}CollegeEmployee不是SchoolManager的直接朋友。出现在局部变量中,违反了迪米特法则。publicvoidprintAllEmployee(CollegeManagersub){ListCollegeEmployeelist1sub。getAllEmployee();System。out。println(学院员工);for(CollegeEmployeee:list1){System。out。println(e。getId());}ListEmployeelist2this。getAllEmployee();System。out。println(学校总部员工);for(Employeee:list2){System。out。println(e。getId());}}}
  改进:将输出学院员工的方法封装到学院员工管理类中。你怎么做的,你去做就可以了,你不用让我知道你怎么做。3、迪米特法则的注意事项迪米特法则的核心是降低类之间的耦合。但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类的耦合关系,并不是要求完全没有依赖关系。七、合成复用原则:
  合成复用原则(compositeResusePrinciple):尽量使用合成、聚合的方式,而不是继承。
投诉 评论 转载

设计模式七大原则《设计模式七大原则》单一职责原则:接口隔离原则:(InterfaceSegregationPrinciple)。依赖倒转原则:(DependenceInversio……深藏在秦岭之中,百分之九十全是森林的地方留坝留坝很小,从地图上找,要用大屏手机,双指向外拨拉好几下。留坝很美,深藏在秦岭之中,百分之九十全是森林,县城也被染得绿油油的。留坝很小,全县只有五万人,相当于回龙观或天通苑……中国篮协换届选举,五大知名人物扛起重任,朱芳雨王芳在列近日有消息称中国篮协正在换届选举,这件事情引起了许多球迷的关注,毕竟在过去几年时间里,篮协所做的工作都没有取得太好的成效,很多球迷都希望篮协可以打造全新的阵容,帮助中国篮球未来……解读一台美国1960年出厂钟控电子管串丝珍妮丝zenitn收前一段时间在跳蚤市场一个专业的有海外老物件的人士手上已当时人民币的价格400元整淘一台美国钟控电子管串丝珍妮丝zenitn收音机,查询海外的论坛资料生产时间是上世纪50到60年……沈阳中街活力归来跨年夜单日客流量创近四年来新高新年伊始,万象更新。在刚刚过去的2022年12月31日晚,沈阳中街,锣鼓喧天、彩灯耀眼,沈河区喜迎2023沈阳古城过大年主题活动的启动,让市民、游客在提前感受了久违喜庆的新年民……护犊子心切郭德纲找云字辈喝酒,反应过激差点害了郭麒麟郭德纲真的老了吗?郭德纲最不喜欢参加酒局,却主动找云字科喝酒,打破了长达十几年的生活习惯,由此也能看出彼时的郭德纲跟以前真的不一样了!近日郭德纲在某平台上,还分享了……患有冠心病的患者,中医建议这四种食物不要再吃,对健康有危害我平时对饮食没什么注意,想吃什么就吃什么,结果发现我的冠心病的症状越来越严重,这是来自一位冠心病患者与我的谈话。这位患者患有冠心病已经有一年的时间,因为这位患者特别喜欢甜食,而……建议中老年人入秋后别太节俭,4种零食可常吃,腿脚有劲精神好时间过得是真快,如今已经是金秋时节了,但大部分地区的气温,仍然还是特别高,在这样的天气里,很多人都会选择吹空调,吃冷饮。其实这种做法是非常不对的,虽然天气依旧炎热,我们还……汤杯陆光祖2小时鏖战险胜,刘雨辰收官,中国5比0横扫法国北京时间5月9日,2022年汤尤杯赛在泰国曼谷继续进行,中国队在汤姆斯杯拿到开门红。陆光祖首场苦战近两个小时险胜拿到开门红,赵俊鹏、何济霆周昊东、李诗沣、刘雨辰和欧烜屹之后各拿……全年5。5的目标,还要不要?7月28日,政治局会议于月末如期召开。历史上看,年中召开的政治局会议通常定调下半年经济政策。鉴于上半年的数据已出,下半年经济政策基本决定了全年经济表现,因此,市场对本次会议充满……贵州一定要去的溶洞景区,以沉积岩为主,是休闲旅游的理想地贵州一定要去的溶洞景区,以沉积岩为主,是休闲旅游的理想地旅游现在好像已经成了大家日常生活里不可或缺的调味剂,旅游能够让我们的心情更加放松,能让我们暂时忘记烦恼,投身大自然……水垢是什么?对身体到底是好还是坏?这些误区也是你犯的说起水垢,你是不是脑中立刻就会浮现起水壶底,那厚厚的一层白色东西,手痒痒得恨不得给马上抠下来?对于它,江湖上有两种截然不同的说法。有人说,长期喝含水垢的水,会得结石……
中医的3个穴位,教你快速缓解过敏性鼻炎人生是一本书,封面是父母给的,内容是自己写的慈善赛上假摔骗点!在为抗击渐冻症的义赛上,哈兰德球品备受质疑吉利设计师玩砸了?极氪009大商务前脸用力过猛,成四不像突发!小乔丹打到对手头部,二级恶犯被驱逐,哈登无辜躺枪河南一老教师穿搭精致,优雅气质年轻人很难模仿,学生也虚心请教网友想办护照出国旅游,国家移民管理局回应建议推迟或取消出境旅乙类乙管实施后出境游会火吗?有旅行社咨询量翻几倍,流失员工主灵魂发问如何缓解手机焦虑?一加新机对症下药给了启发小雪养生扶阳固本是关键,这份养生指南请收好法网第11比赛日看点世界第一冲击33连胜,金花组合双打再出击教师公公每天让孙女读山海经,7岁娃的变化,让儿媳和老师都佩服
运动中的量子磁铁校园的梧桐树四年级作文450字助职场男性抗压的六大美食泥沙俱下造句用泥沙俱下造句大全看星座男怎样让女人幸福双11前快递要涨价!中通率先宣布调价澳洲的黑山,失踪案不断,飞行员胆怯绕道而飞黄果树瀑布的风景作文劳务的合同没有谁天生就是理所当然的付出6599元!美的推出新款16套洗碗机一级水效三星消毒端午节挂艾草的2不采,1不挂,4讲究,你都知道吗?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁