一、单一职责原则(提倡高内聚)
定义:一个类,应当只有一个引起它变化的原因;即一个类应该只有一个职责。
就一个类而言,应该只专注于做一件事且仅有一个引起它变化的原因,该职责提出了对对象职责的一种理想期望,对象不应该承担太多职责,正如人不该一心分为二用。唯有专注,才能保证对象的高内聚;唯有单一,才能保证对象的细粒度。对象的高内聚和细粒度有利于对象的重用。
优点:
- 降低类的复杂性
- 提高类的可读性
- 提高代码的可维护性和复用性
- 降低因变更引起的风险
二、接口隔离原则
接口有分类:
-
实例接口
- 解释:在Java中申明一个类,然后用new关键字产生一个实例,它是对一个类型事物所具有的方法特征的描述,也叫做一个“接口”,这仅仅是一种逻辑上的抽象(eg:Person A=new Person();产生一个实例,该实例遵从的标准是Person这个类,Person就是A的接口)。
- 原则定义:客户端不应该依赖它不需要的接口。
- 类接口
- 解释:在Java中使用Interface严格定义的接口。
- 原则定义:类之间的依赖关系应该建立在最小接口上。
具体含义:
- 一个类对另一个类的依赖性应该建立在最小接口上。
- 一个接口代表一个角色,不应该将不同的角色都交给一个接口。
- 不应该强迫客户依赖于他们不用的方法。
应用场景:
- 只提供用户需要的方法,屏蔽不需要的方法。
- 一个接口只对一个子模块或业务逻辑进行服务。
- 接口设计因项目而异,因环境而异。
注:接口隔离原则有点像单一职责原则,它们的区别在于:接口隔离要求接口设计尽量原子化,做到接口专一,避免接口臃肿,降低子类间的依赖耦合;单一职责原则要求类的设计尽量原子化,做到类专一,降低类之间的耦合,提高内聚;
三、开—闭原则
定义:一个软件实体应该对扩展开放,对修改关闭。
即当设计一个模块时,应该使这个模块可以在不被修改的前提下被扩展,也就是在源码不被改变的前提下改变这个模块的行为。面向对象设计中,开—闭原则是最基础的,起到总的指导作用,其他原则都是该原则的具体形态。
四、依赖倒置原则
定义:面向接口编程。
具体含义:
- 高层模块不应该依赖低层模块,两者都应该依赖于抽象。
- 抽象不应该依赖于细节。
- 细节应该依赖于抽象。
在Java中,抽象就是指接口或抽象类,两者都是不能被实例化的。细节就是实现类,其特点就是可以被实例化(new关键字)。故依赖倒置原则在Java中的体现为:
- 模块之间的依赖是通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
- 接口或抽象类不依赖于实现类。
- 实现类依赖接口或抽象类。
五、里氏替换原则
定义:任何基类可以出现的地方,子类一定可以出现(即:子类必须能够替换掉父类)。
具体含义:(子类可以扩展父类的功能,但是不能改变父类原有的功能。)
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
- 子类可以增加自己特有的方法。
- 当子类的方法重载父类方法时,方法的前置条件(即方法的形参)要比父类的方法的输入参数更宽松。
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
六、迪米特法则(强调松耦合)
定义:又叫最少知识原则,对一个类中的部分调用采用第三者转发(只与最直接的朋友通信)。
避免类之间的直接通信,而是以“中介”的形式来建立关系。如总公司通过分公司这个“中介”来与分公司的员工发生联系。
迪米特法则的初衷是降低类之间的耦合,这样的要求决定了需要创建更多的类。所有不能过分的使用该法则,否则会导致系统复杂度变大。
+合成聚合复用原则
定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。
强调:要尽量使用合成/聚合,尽量不使用继承
- 六大设计原则在Java中的实现是建立在继承之上的。
- 合成用来表示一种很强的“拥有”关系,私有。如房子与房间的关系,房子没了,房间也就没了。
- 聚合用于表示一种弱的“拥有”关系,共享。如图书馆与书籍的关系,图书馆没了,书籍还可以搬到别的地方,而不会随着图书馆的消失而消失。
参考: