开闭原则:

对扩展开放,对修改关闭。当需求更改后, 不去修改源代码, 可以扩展模块功能,满足需求。通过接口或者抽象类为软件实体定义相对稳定的抽象层,将相同的可变因素封装到相同的具体实现类。
例子: 对于壁纸(图片,颜色,声音)是确定值,但是用户可以选择不同的主题,此时将壁纸作为抽象类, 将主题作为子类。用户可以任意选择主题。满足开闭原则。

里氏替换原则:

是对开闭原则的一个延伸, 做了更多一些的约束。
约束1:
就是子类在继承父类的时候, 父类的方法在子类身上必须全部适用。(反例: 如果枪(AbstractGun)是一个父类,它有射击(shoot)这么一个方法. 对于步枪(buqiang),手枪(handGun)等真实的枪都适用。但是对于玩具枪(toyGun)来说不适用。所以这里违反了里氏代换原则。)
解决方法:
找到枪(AbstractGun)和玩具枪(toyGun)共同点, 形状,声音…作为抽象类AbstractToy, 将枪和玩具枪同时继承AbstractToy。 然后两个基类可以继续延伸。

约束2: 子类在继承父类的时候,有一些自己特有的方法, 所以在使用该特有方法时是无法使用父类或者接口的。违反了里氏替换原则。
约束3: 子类继承父类,入参范围要大于父类。返回参数范围要小于父类。这个其实在java继承机制里面已经实现。

依赖倒置原则:

面向接口编程,不要面向实现编程。
实现方式:
每一个类都尽可能提供接口或者抽象类。
变量的声明类型尽量是接口或者抽象类。
任何类都不应该从具体类派生。
使用继承时尽量遵循里氏替换原则。

单一职责原则:

接口隔离原则:

将庞大的接口拆分成更小和更具体的接口。理念上与单一职责原则相似。 他们都是为了提高类的内聚,降低类之间的耦合。
两者区别:

  1. - 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
  2. - 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

迪米特法则:

如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

合成复用原则:

它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

总结:

这 7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。