1.单一职责原则(Single Responsibility Principle)

    1. 降低类的复杂度,一个类只负责一项职责
    2. 提高类的可读性,可维护性
    3. 降低变更引起的风险
    4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;
    5. 只有类中方法数量足够少,可以在方法级别保持单一职责原则

    2.接口隔离原则(Interface Segregation Principle)

    1. 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
    2. 举例:一个类如果要实现一个接口,那么就要实现这个接口要求的所有方法,
    3. 如果这个接口里面包含这个类不需要的方法,那么就会造成接口污染,
    4. 这是不好的设计,会对系统留下隐患。接口需要拆分,粒度分解。

    3.依赖倒转原则(Dependence Inversion Principle)

    1. 程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
    2. 高层模块不应该依赖低层模块,高层模块和低层模块都应该依赖于抽象。
    3. 抽象不应该依赖于具体,具体应该依赖于抽象。
    4. 从Java角度看待依赖倒转原则的本质就是:面向接口(抽象)编程。
    5. 每个具体的类都应该有其接口或者基类,或者两者都具备。
    6. 类中的引用对象应该是接口或者基类。
    7. 任何具体类都不应该派生出子类。
    8. 尽量不要覆写基类中的方法。
    9. 结合里氏代换原则使用。

    4.里氏替换原则(LSP)

    1. 子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
    2. 继承时需要遵循里氏替换原则

    5.开闭原则(OCP)

    1. 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应尽量在不修改原(是"原",指原来的代码)代码的情况下进行扩展。
    2. 1、通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法,也就是扩展必须添加具体
    3. 实现而不是改变具体的方法。
    4. 2、参数类型、引用对象尽量使用接口或者抽象类,而不是实现类,这样就能尽量保证抽象层是稳定的。
    5. 3、一般抽象模块设计完成(例如接口的方法已经敲定),不允许修改接口或者抽象方法的定义。

    6.迪米特法则(DP)

    1. 最少知道原则:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,
    2. 可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
    3. 一个对象的"朋友"包括他本身(this)、它持有的成员对象、入参对象、它所创建的对象。
    4. 尽量少发布public的变量和方法,一旦公开的属性和方法越多,修改的时候影响的范围越大。
    5. 如果一个方法放在本类中,既不产生新的类间依赖,也不造成负面的影响,
    6. 那么次方法就应该放在本类中。

    7.合成复用原则(CRP)

    1. 基本介绍:原则是尽量使用合成/聚合的方式,而不是使用继承
    2. 依赖关系:在b类中写个方法,传参进去
    3. 聚合关系:一个A类对象的成员变量,通过set方法设置进来
    4. 组合关系:b类中A是成员变量,直接new