【面向对象基础】| 面向对象设计的六原则理解和区别
2018-03-02 本文已影响34人
曦曦冉冉L
每次说到六原则,可能开始只是会随口而来的几句定义,但是真正去设计模式的时候有正确应用呢?
笔者总结一下它们之间的关系,以及对应的面向对象的抽象,封装,继承,多态的特性呢?
1.功能简单单一组,对应特征:封装
要求模块间松耦合,内部高聚合。
1)单一职责原则——SRP (针对类Class的单一功能要求)
抽象类,普通类要求功能简单明了,避免多个功能耦合在一个类里面
2)接口隔离原则——ISP(针对接口Interface的单一功能要求)
接口设计要求功能单一,避免功能过多耦合,避免继承于接口的类实现冗余功能的。
3)迪米特原则 最小依赖原则——LOD(针对方法与方法之间的接口API的单一要求)
方法与方法之间调用时尽量减少类对象的内容,尽可能的使用原子类型变量,使用枚举类型变量。保证方法与方法调用时候导致与其他类的耦合关系尽量减少。特别是提供给外界的参数时,不要让其他类过多知道自己类的内部内容。
2. 封闭不修改组 ,对应特征:封装+继承
1)里式替换原则——LSP
父类实现的方法子类可以直接使用,避免功能代码的重复,子类不可以复写,只能新建其他的方法。
如果要实现扩展,则可以参考依赖导致倒置原则(不从实例化的父类中继承,而从基于抽象类和接口的继承)。
2)开闭原则——OCP
对修改封闭,对扩展允许。不能修改已有的类/父类,通过扩展实现修改软件的变化。因为已有的类的方法和接口 可能存在多个继承,动了BaseClass,继承的其他类也会受到影响。扩展方式参考依赖倒置原则。
3. OOP模式原型组,对应特征:抽象+多态
1)依赖倒置原则——DIP
大多数设计模式都是基于依赖倒置原则设计。基于前面第二点里氏替换原则和开闭原则的硬性要求,实现方式是依赖倒置原则。如果需要扩展,需要父类抽象或者接口继承的方式。调用的接口固定,无论是两边内容有修改,都可以保证接口不变。
这篇面向对象六大原则文章讲的比较形象,并且附带代码。
知乎这篇问题讲了 里氏置换原则的疑问点。