1)单一责任原则
单一性原则主要是针对类的设计约束,一个类应该尽量完成单一的功能,即只能因为一个因素的改变而改变,反之,如果一个类完成了多件事情,那么完成这几件事情中的任意一个因素发生改变,该类就可能要重新设计,牵一发而动全身,有失美感。也会增加维护系统的成本和风险。
2)里氏替换原则
里氏替换原则主要是针对类的继承而言,一个子类是否能继承父类的标准应该是该子类是否能够替换父类的任意一个应用场景。但并不是所有的父类应用场景子类都能替换,比如子类不能访问父类的私有信息。
3)接口隔离原则
接口隔离原则主要是针对在创造接口的时候尽量小而专,一个接口尽量是针对某个特定的功能而设计,避免出现“臃肿”的接口,一个类的对另外一个类的依赖应该尽量限制在最小的接口上,而不要强迫一个类依赖它不需要的方法。
接口隔离强调接口功能的单一性,而“臃肿”的接口存在明显的弊端,会导致实现该接口的类完全依赖于该接口的所有方法和属性,而这些多余的属性和方法对类的实现来说是一种浪费,且当接口需要改变的将导致被依赖的程序进行一连串的修改,这种修改将是灾难性的。所以在设计接口的时候应该保证接口是定制化的,使得实现该接口的程序只依赖实际使用的方法。
4)开放闭合原则
开放闭合原则是针对增加扩展软件的功能而言,其核心思想是:软件的实体应该是可扩展的而不是可修改的。开放是指对扩展开发,封闭是指对原有程序的修改封闭。开放闭合原则主要体现在两个方面,一是:对扩展开发,对遇到新的软件功能需求应该通过扩展已有代码以满足新的需求,二是:对修改封闭,当一个类一旦设计完成,已经被众多程序使用时,就不应该对其进行任何尝试性的修改。
实现开放闭合原则的方法就是面向对象编程,而不是面向过程编程,让类依赖于固定的抽象,所以修改是封闭的;而通过面向对象的多态和继承机制,继承、复写其原有的方法来满足扩展的需要。
软件需求总是变化的,开放封闭原则就是封闭软件变化对已有程序的影响,保证已有程序内部封装的稳定性,又能满足新的需求,这应该是所有大型项目的福音。
PS:进行抽象的时候应该是针对代码中变动比较大的部分,对代码中每一个部分都进行抽象也不是好事,另外拒绝不成熟的抽象与抽象本身一样重要。
5)依赖倒置原则
依赖倒置主要用来解决传统软件结构出现的高层依赖于底层的依赖关系,所谓“倒置”就是打破传统软件结构中出现的高低层依赖关系。
如果定义一个接口,此接口用于说明高层需要用到的功能,而底层只是根据这个接口来做具体实现,那么这个高层就能在任何符合这个接口规范的底层软件上运行,保证了高层的独立性,解决高层软件的复用问题。由于这个接口是抽象的,而高层依赖于这个接口,而不是底层具体的实现,所以叫做高层依赖于抽象而不是具体的底层实现。
PS:说白了就是 高层针对接口进行编程,底层也针对接口编程。
6)迪米特法则
迪米特法则也叫最少知识原则,当两个对象不必直接通行的时候,那么这两个类就不必发生直接的相互作用。如果其中一个对象实在需要临时调用另外一个对象的某些特定,可以通过第三者转发这个调用。
PS: 这其实是模块化设计的一个基本要求,当你需要调用一个模块的某个功能的时候,你只需要知道这个模块向外的接口就好,而不需要熟悉具体的实现。
7)合成(composition)/聚合(aggregation)原则
合成和聚合都是特殊的关联种类,聚合表示一种弱的拥有关系,体现的是A对象包含B对象,但是B对象并不是A对象的一部分,而合成表示的是一种强的拥有关系,体现了严格的部分与整体的关系,部分与整体拥有相同的声明周期
由于类的继承是一种强耦合的关系,如果父类改变,那么子类也必须跟着改变,所以要避免滥用继承,继承时要满足里氏替换原则。