七大原则
| 标记 | 设计模式原则名称 | 简单定义 |
| OCP | 开闭原则 | 对扩展开放,对修改关闭 |
| SRP | 单一职责原则 | 一个类只负责一个功能领域中的相应职责 |
| LSP | 里氏代换原则 | 所有引用基类的地方必须能透明地使用其子类的对象 |
| **DIP** | **依赖倒转原则** | **依赖于抽象,不能依赖于具体实现** |
| ISP | 接口隔离原则 | 类之间的依赖关系应该建立在最小的接口上 |
| CARP | 合成/聚合复用原则 | 尽量使用合成/聚合,而不是通过继承达到复用的目的 |
| LOD | 迪米特法则 | 一个软件实体应当尽可能少的与其他实体发生相互作用 |
其中,单一职责原则、开闭原则、迪米特法则、里氏代换原则和接口隔离原则就是我们平常熟知的 SOLID。
开闭原则
- 实现开闭原则依赖于依赖倒置原则,而要实现依赖倒置,需要先进行抽象化,抽象化的具体指导原则即是里氏替换原则
里氏替换原则
- 里氏代换原则是实现开闭原则的重要方式之一
- 所有能用父类的地方,都能替换成子类;反之则不成立
意义
- 里氏代换原则是实现开闭原则的基础,告诉我们在设计程序的时候进可能使用基类进行对象的定义和引用,在运行时再决定基类的具体子类型。
单一职责原则
指一个类或者模块应该有且只有一个改变的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力
合成/聚合复用原则
尽量使用合成/聚合,而不是通过继承达到复用的目的。
合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向内部持有的这些对象的委派达到复用已有功能的目的,而不是通过继承来获得已有的功能。
如果有阅读过《Effective Java 2nd》的同学就知道,此书也建议慎用继承。一般情况下,只有明确知道派生类和基类满IS A的时候才选用继承,当满足HAS A或者不能判断的情况下应该选用合成/聚合。
迪米特法则
有时候也叫做最少知识原则(Least Knowledge Principle,LKP),它的定义是:一个软件实体应当尽可能少地与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。迪米特法则的初衷在于降低类之间的耦合。
迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类(中间类或者跳转类)来转达。
接口隔离原则
1)一个类对另外一个类的依赖性应当是建立在最小的接口上的。
2)客户端程序不应该依赖它不需要的接口方法(功能)。
在实际应用中,会遇到如下问题:比如,我需要一个能适配多种类型数据库的 DAO 实现,那么首先应实现一个数据库操作的接口,其中规定一些数据库操作的基本方法,比如连接数据库、增删改查、关闭数据库等。这是一个最少功能的接口。对于一些 MySQL 中特有的而其他数据库里并不存在的或性质不同的方法,如 PHP 里可能用到的 MySQL 的 pconnect 方法,其他数据库里并不存在和这个方法相同的概念,这个方法也就不应该出现在这个基本的接口里,那这个基本的接口应该有哪些基本的方法呢?PDO 已经告诉你了。 PDO 是一个抽象的数据库接口层,它告诉我们一个基本的数据库操作接口应该实现哪些基本的方法。接口是一个高层次的抽象,所以接口里的方法都应该是通用的、基本的、不易变化的。 还有一个问题,那些特有的方法应该怎么实现?根据 ISP 原则,这些方法可以在别一个接口中存在,让这个“异类”同时实现这两个接口。 对于接口的污染,可以考虑这两条处理方式:
- 利用委托分离接口。
- 利用多继承分离接口。 委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理,如策略模式、代理模式等中都应用到了委托的概念。
参考
https://www.runoob.com/note/39073