单一职责原则、开放封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则

1.单一职责原则(SRP):
就一个类而言,应该仅有一个引起它变化的原因。
如果一个类承担的职责太多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。 比如业务操作和日志记录类进行分开,界面和逻辑分开等等。职责分离,单一职责,更有利于维护和拓展。

2.开放-封闭原则:
类,模块,函数等等,应该可以拓展,但是不可以修改。
也就是:对于拓展是开放的,对于更改是封闭的。

也就是 时刻谨记,面对新的需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

实际开发中,比如说要实现一个加法程序, 写好之后,过了不久,又要实现减法功能, 那么应该是将加法程序和减法程序公共的部分抽象出来,然后写一个新的减法类,而不是在原来的加法程序里面进行修改。
这样以后,如果要继续增加乘法和除法的功能,就只需要拓展乘法和除法的类就行了。

我们在最初编写代码的时候,假设代码不会发生变化,当变化发生时,我们就创建抽象来隔离以后发生的同类变化。

开闭原则是面向对象设计的核心所在,遵循这个原则 可以实现 可维护性,可复用,灵活性好等优点, 开发人员应对频繁变化的部分进行抽象。

3.依赖倒转原则
1.高层模块不应该依赖底层模块,两个都应该依赖抽象
2.抽象不应该依赖细节,细节应该依赖抽象。

具体来说就是,针对接口编程,不要对实现编程。

依赖接口的好处就是,不用关心接口内部的实现,需要知道接口的名称,参数,返回值即可,内部如何实现和更改对于外部调用者不需要关心。

举个现实世界的例子,任何牌子的usb线 都能插在电脑的usb接口上,就是因为 usb的接口是统一的,一样的引脚和大小,任何厂家 只要遵守这个规范的线都可以接入。

还有java里面的jdbc 驱动,不同的数据库比如mysql sqlserver等 驱动的内部实现都是不一样的,但是都可以使用一套接口去调用。

比如说,我们将访问数据库的操作都封装成了一些函数,然后高层业务层需要用到的时候就去调那些函数,这就是高层依赖了底层。

高层业务层都是一样的情况下,如果哪天要使用不同的数据库, 这个时候就麻烦了,因为这个时候 ,高层通过和底层的具体的某个数据库绑定到了一起,就没法复用了。

但是如果高层是通过接口去和底层耦合的话,那么高层就不需要改动,只需要改动接口的实现类即可。

单一职责原则、开放封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则

4.里氏代换原则
子类型必须能够替换掉它的父类型

只有这样,才能使得父类复用才有可能,子类也能在父类的基础上进行拓展。

总结:面向对象的设计,编写时候考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,这就是面向对象的设计

5.迪米特法则(Lod)
也叫最小知识原则:
如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的话,应当通过第三者转发这调用。

该法则强调的是在类的设计上,每一个类都应当尽量降低成员的访问权限,根本思想是强调了类之间的松耦合。
类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。

举个例子,策略模式里面,具体使用哪个策略,由context来负责安排,客户端只需要传入具体的参数类型即可,这样即使策略发生修改,客户端也不需要做任何更改。

6、合成/聚合复用原则(Composition/Aggregation Principle],简称CARP)
合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承。合成聚合是“has a”的关系,而继承是“is a”的关系。由于继承是一中强耦合的结构,父类变,子类必变。所以不是“is a”关系,我们一般不要用继承。优先使用合成聚合复用原则,有助于保持每个类的封装,降低继承的层次。