【面向对象基础】| 面向对象设计的六原则理解和区别

每次说到六原则,可能开始只是会随口而来的几句定义,但是真正去设计模式的时候有正确应用呢?
笔者总结一下它们之间的关系,以及对应的面向对象的抽象,封装,继承,多态的特性呢?

1.功能简单单一组,对应特征:封装

    要求模块间松耦合,内部高聚合。

    1)单一职责原则——SRP  (针对类Class的单一功能要求

          抽象类,普通类要求功能简单明了,避免多个功能耦合在一个类里面

    2)接口隔离原则——ISP针对接口Interface的单一功能要求

         接口设计要求功能单一,避免功能过多耦合,避免继承于接口的类实现冗余功能的。

    3)迪米特原则 最小依赖原则——LOD(针对方法与方法之间的接口API的单一要求

         方法与方法之间调用时尽量减少类对象的内容,尽可能的使用原子类型变量,使用枚举类型变量。

         保证方法与方法调用时候导致与其他类的耦合关系尽量减少。

         特别是提供给外界的参数时,不要让其他类过多知道自己类的内部内容。


2. 封闭不修改组 ,应特征:封装+继承

    1)里式替换原则——LSP

     父类实现的方法子类可以直接使用,避免功能代码的重复,子类不可以复写,只能新建其他的方法。

     如果要实现扩展,则可以参考依赖导致倒置原则(不从实例化的父类中继承,而从基于抽象类和接口的继承)。

【面向对象基础】| 面向对象设计的六原则理解和区别

     2)开闭原则——OCP

        对修改封闭,对扩展允许。不能修改已有的类/父类,通过扩展实现修改软件的变化。因为已有的类的方法和接口 可能存在多个继承,动了BaseClass,继承的其他类也会受到影响。扩展方式参考依赖倒置原则。


3. OOP模式原型组,对应特征:抽象+多态

    1)依赖倒置原则——DIP

        依赖倒置原则的几个关键点:

  • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;
  • 抽象不应该依赖细节;
  • 细节应该依赖抽象。
     
大多数设计模式都是基于依赖倒置原则设计。
     基于前面第二点里氏替换原则和开闭原则的硬性要求,实现方式是依赖倒置原则。如果需要扩展,需要父类抽象或者接口继承的方式。调用的接口固定,无论是两边内容有修改,都可以保证接口不变。


【面向对象基础】| 面向对象设计的六原则理解和区别


------------------------------------------------------------------------------------------------

这篇面向对象六大原则文章讲的比较形象,并且附带代码。

知乎这篇问题讲了 里氏置换原则的疑问点。