面向对象设计七大原则

1、单一职责原则(Single Responsibility Principle 简称SRP)

概念: 每一个类应该专注于做一件事情,即只有一个职责,不要把过多的业务放在一个类中完成
核心思想: 解耦和增强内聚性(高内聚,低耦合)
理解: 类被修改的几率非常高,如果把多个功能放到一块,其中一个功能修改可能会影响到其他功能,保证类的职责单一,使其引起类变化的原因只有一个,通常我们是通过把 类拆分为最小的职能单位来实现的,保证类的职责单一,那么它组合与复用的时候就方便很多。如果一个类的职能过多,在组合复用的时候就会引入一些不必要的代码,从而造成代码污染

2、开闭原则(Open Closed Principle 简称:OCP)

概念: 面向扩展开放,面向修改关闭
核心思想: 对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
理解: 在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放),即我们写代码的时候,需要考虑 当需求变化的时候,不是通过修改原来的代码来实现该需求,而是通过新增代码来完成需求。逆向思维理解下,如果当需求变化的时候,我们都需要修改原来的代码,存在很大 由于修改错误引起现有正常功能出错从而产生蝴蝶效应,相应的系统维护成本也增高,现在公司均重视维护成本,该原则有句潜台词:控制需求变动风险,缩小系统维护成本

3、里氏替换原则(Liskov Substitution Principle 简称:LSP)

概念: 超类存在的地方,子类是可以替换的
核心思想:

理解: 子类能够替换父类出现在任何地方,这是在多态的前提下,本文所说的扩展灵活性,都是在不改变声明类型,而是通过改变声明类型的实例化对象来完成扩展及需求的 变更的。当然继承好像本身都满足这个条件,但是我们这里更注重的是继承的应用。

4、依赖倒转原则(Dependence Inversion Principle 简称:DIP)

概念: 实现尽量依赖抽象,不依赖具体实现
核心:

实现方法

理解: 理解依赖倒置原则之前我们先了解下传统的依赖,被调用者依赖调用者,即调用者决定了被调用者应该具有哪些方法,什么样的实现,在需求变更的时候,我们需要 付出很大的代价甚至推翻重做。依赖倒置要求调用者和被调用者都依赖抽象,两者之前没有具体的关联和接触,当一方变动时只用抽象不变动就不会影响另一方;依赖倒置的潜台词 面向抽象编程,解耦调用和被调用者

5、接口分离原则(Interface Segregation Principle 简称:ISP)

概念: 应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
核心: 不要使客户端依赖于他们不需要的方法,即一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口当中;
实现方法:

理解: 接口隔离原则可以说是单一职责的必要手段,它的含义就是尽量使用职责单一的接口,而不要使用复杂,全面的接口。接口是要子类实现的,接口职责单一,类也就 职责单一了,如果接口融合了多个不相关的方法,那它的子类就被迫要实现所有方法,尽管有些方法是根本用不到的。这就是接口污染。接口隔离原则的潜台词:拆分,从接口开始。

6、迪米特原则(Law of Demeter 简称:LOD)

概念: 又叫最少知识原则,一个类应当尽可能少的与其他实体发生相互作用
核心:

实现方式:

7、组合/聚合复用原则(Composite/Aggregate Reuse Principle 简称:CARP)

概念: 尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。

核心: 尽量使用对象组合,而不是继承来达到复用的目的。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些 对象的委派达到复用已有功能的目的。复用的种类:继承和合成聚合

理解: 如果只是为了代码的复用,尽量使用组合与聚合,而不是继承。组合聚合只是引用其他类的方法,而不会受到引用类的继承而改变血统。继承的耦合性比较大 ,比如一个父类后来添加实现了一个接口或者去掉一个接口,那么子类可能会遭到毁灭性的打击,但是如果使用组合聚合,只引用类的方法,就不会出现这种风险;组合的 潜台词: 我只用你的方法,我们不一定是同类;