面向对象的设计原则(六原则一法则)

版权声明:转发请标明出处,谢谢! https://blog.csdn.net/Myuhua/article/details/81562759

(一)单一职责原则:一个类只做它该做的事情。

单一职责想表达的就是“高内聚”,所谓高内聚就是一个代码模块只完成一项功能,在面向对象中,如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚原则,这个类就只有单一职责。这个就好比一辆车由成千山万的元件组成,而每一种元件都有它自己特殊的用途,比如火花塞就是用来引燃的,气缸驱动杆就是用来压缩的....各个组件都是可以拆卸和重新组装的,通过它们之间相互协作,发挥各自的特有的功能,组装成了一辆车。一个好的软件系统,它里面的每个模块也应该是可以轻易的拿到其他系统中使用的,才能实现软件的复用的目的。

(二)开闭原则:软件实体应当对扩展开放,对修改关闭。

在理想的状态下,当我们需要为一个软件系统增加新功能时,只需要从原来的系统派生出一些新类就可以,不需要修改原来的任何一行代码。

要做到开闭有两个要点:1)抽象是关键,一个系统中如果没有抽象类或接口系统就没有扩展点。

                                       2)封装的可变性,将系统中的各种可变因素封装到一个继承结构中,如果多个可变因素混杂在一起,                                                 系统将变得复杂而混乱。可参考《设计模式精解》。

(三)依赖倒转原则:面向接口编程。

该原则说的直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所代替。

(四)里氏替换原则:任何时候都可以用子类替换掉父类型。

简单的说就是能用父类型的地方就一定能使用子类型。里氏替换原则可以检查继承关系是否合理,如果一个继承关系违背了里氏替换原则,那么这个继承关系一定是错误的,需要对代码进行重构。在考虑继承关系时,想一想子类跟父类能不能用:xx是xx讲得通,比如:老虎类继承动物类,老虎是动物(正确);猫类继承狗类,猫是狗(错误)。

需要注意的是:子类一定是增加父类的能力而不是减少父类的能力,因为子类比父类的能力更多,把能力多的对象当成能力少的对象来用当然没有任何问题。

(五)接口隔离原则:接口要小而专,绝不能大而全。

臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,接口也应该是高度内聚的。例如:琴棋书画就应该分别设计为4个接口,而不应设计成一个接口中的四个方法,因为如果设计成一个接口中的四个方法,那么这个接口很难用,毕竟琴棋书画四样都精通的人不多,而如果设计成四个接口,会几项就实现几个接口,这样的话每个接口被复用的可能性是很高的。

java中的接口代表能力、代表约定、代表角色,能否正确使用接口是编程水平高低的重要表示。

(六)合成聚合复用原则:优先使用聚合或合成关系复用代码。

通过继承开复用代码是面向对象程序设计中被滥用的最多的东西,简单的说,类与类之间的有三种关系,继承关系(Is-A),关联关系(Has-A),依赖关系(Use-A),这个在以前jave面向对象那篇文章里讲过了。其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,说白了都是关联关系,合成聚合复用想表达的是优先考虑关联(Has-A)关系,而不是继承(Is-A)关系复用代码。

java的API中也有不少继承滥用的例子,例如,Properties类继承了Hashtable类,Stack类继承了Vector类,这些继承明显就是错误的,更好的做法是在Properties类中放置一个Hashtable类型的成员并且将其键和值都设置为字符串来存储数据,而Stack类的设计也应该是Stack类中放一个Vector对象来存储数据。

重要:记得任何时候都不要继承工具类,工具是可以拥有并可以使用的,而不是拿来继承的。

(七)迪米特法则:它又称为最少知识原则,一个对象应当对其他对象有尽可能少的了解。

迪米特法则简答的说就是如何做到“低耦合”,门面模式和调停者模式就是对迪米特法则的践行。更通俗的讲,它就是不要和陌生人打交道,如果真的需要,找一个自己的朋友,让他替你和陌生人打交道。

门面模式举例:你去一家公司洽谈业务,你不需要了解这个公司内部是如何运作的,你只需要找到公司前台小妹,告诉她们你要做什么,她们会找到合适的人跟你接洽。而这个前台的小妹就是公司这个系统的门面。再复杂的系统都可以为用户提供一个简单的门面,java Web开发中作为前端控制器的Servlet或Filter就是一个系统的门面,浏览器对服务器的运作方式一无所知,但是通过前端控制器就能够根据你的请求得到相应的服务。

调停者模式举例:一台计算机,cpu、内存、硬盘、显卡、声卡各种设备需要相互配合才能很好的工作,但是如果这些东西都直接连接到一起,计算机的布线将异常复杂,在这种情况下,主板作为一个调停者身份出现,它将各个设备连接在一起而不需要每个设备之间直接交换数据,这样就减小了系统的耦合度和复杂度。

若有问题欢迎大家与我互动交流,可评论,可留言,以后每周我会坚持至少更新一篇博客文章,喜欢的朋友可以加一下关注。

猜你喜欢

转载自blog.csdn.net/Myuhua/article/details/81562759