今天主要看看OO设计原则:SOLID
1.Single Responsibility Principle(单一责任原则)
通俗来讲,单一责任原则,就是将类的功能单一。
- 一个类不能太“累”,在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小。
- 一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能影响到其他职责的运作。
SRP:不应有多于1个的原因使得一个类发生变化
如果一个类包含了多个责任,那么将引起不良后果
- 引入额外的包,占据资源
- 导致频繁的重新配置、部署等
SRP优势:
- 每个类的复杂性降低,功能单一,实现较为简单
- 可复用性强,每个类只包含单一的功能,便于复用
- 可维护性强,单一的类与类之间耦合度低,一旦该类出现异常,对其他类影响较小,且很容易定位异常的地方,便于维护。
2.Open/Closed Principle (开放/封闭原则)
思想: 对扩展性开放:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
体现在:
- 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
- 对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。如果一个模块不能被修改,那么它通常被认为是具有固定的行为.
即对于软件设计者来说,必须在不需要对原有的系统进行修改的情况下,实现灵活的系统扩展。而如何能做到这一点呢?
关键的核心技术就是抽象!实现开放封闭的核心思想就是对抽象编程,而不对具体编程
- 让类依赖于固定的抽象,所以对修改就是封闭的;
- 而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。
3.Liskov Substitution Principle(Liskov替换原则)
Liskov替换原则:任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
即继承必须确保超类所拥有的性质在子类中仍然成立。"也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
Liskov替换原则描述了在什么情况下上述性质才成立,概括为以下几点:
- 子类型可以增加方法,但不可删
- 子类型需要实现抽象类型中的所有未实现方法
- 子类型中重写的方法必须有相同或子类型的返回值或者符合协变的参数(即子类的返回值是父类的返回值的子类型)
- 子类型中重写的方法必须使用同样类型的参数或者符合逆变的参数(即父类的参数是子类的参数的子类型)
- 子类型中重写的方法不能抛出额外的异常,而且抛出的异常必须和父类相同或者是父类抛出的异常的子类。
- 对于所有继承父类的方法而言,子类中的方法必须比父类有更强的不变量,即更弱的前置条件/更强的后置条件。(不变量强度相同也可以)
4.Interface Segregation Principle(接口隔离原则)
基本思想:
- 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
- 一个类对另外一个类的依赖性应当是建立在最小的接口上的。
- 不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构,客户端只访问自己所需要的接口。
- 将胖接口分解为多个小的接口。
5.Dependency Inversion Principle(依赖转置原则)
依赖转置原则思想:
- 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
- 抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
- 要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。