第六章.OOP程序设计的基本原则
主要内容:6.1概述 6.2 对象的抽象 6.3 单一职责原则 6.4 迪米特原则 6.5 接口隔离原则 6.6 开放-封闭原则 6.7 里氏替换原则 6.8 合成/聚合复用原则
6.1——概述
OOP即面向对象程序设计,OOP中引入了接口、抽象类、继承、多态等概念,但是在使用这些特性进行设计的时候,经常会产生接口、抽象设计混乱,类设计、类耦合和依赖不合理等问题。本章给出了OOP设计时要遵循的设计原则:单一职责、迪米特、里氏替换、接口隔离、开放-封闭、合成/聚合等原则,并结合实例来理解每种原则。
6.2——对象的抽象
在设计程序时,必须要发现软件中可能存在或已经存在的“变化”,找到这些可能发生变化的部分,将变化的部分同稳定的部分分隔开,利用抽象的方法将变化的部分进行封装,抽象的实现方法有两种:抽象类和接口。
抽象类或接口是在设计时,没有具体的实现,只是对对象的属性和行为的进行描述,在创建派生类或实现类时,根据类别自己的属性和行为进行具体的实现,根据上转型对象或接口回调引用不同子类的实现,从而适应子类的不同实现。
6.3——单一职责原则
分支结构也称选择结构,这种结构用来有条件地执行或跳过特定的语句或语句块,实现有选择的流程控制。主要有三种分支结构,即单路分支结构,双路分支结构和多路分支结构。
6.4——迪米特原则
迪米特原则也称为最少知识原则(Least Knowledge Principle),一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少。类的内部如何实现、如何复杂都与调用者或者依赖者没关系,调用者或者依赖者只需要知道它需要的方法即可,其他的我一概不关心。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
迪米特原则还有一个英文解释是: Only talk to your immedate friends( 只与直接的朋友通信。)什么叫做直接的朋友呢?每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,例如组合、聚合、依赖等。
6.5——接口隔离原则
一个类对另一个类的依赖应该建立在最小的接口上。根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的对象只需知道与之相关的方法即可。
6.6——开放-封闭原则
开闭原则(open-closed principle)是 Java最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统。开闭原则的定义是:对扩展开放,对修改关闭。在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误。因此当软件需要变化时,我们应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。也就是说,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。高层模块不应该依赖底层模块,抽象不应该依赖细节。
6.7——里氏替换原则
里氏替换原则( Liskov Substitution Principle,LSP)依赖于继承、多态这两大特性。里氏替换原则简单来说就是所有引用基类的地方必须能透明地使用其子类的对象。通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。
6.8——合成/聚合复用原则
里氏替换原则( Liskov Substitution Principle,LSP)依赖于继承、多态这两大特性。里氏替换原则简单来说就是所有引用基类的地方必须能透明地使用其子类的对象。通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。