薛磊 Job Seeker

23种设计模式——面向对象设计模式与原则


 面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。

​ OOPL没有回答面向对象的根本性问题——我们为什么要使用面向对象?我们应该怎样使用三大机制来实现“好的面向对象”?我们应该遵循什么样的面向对象原则?

​ 任何一个严肃的面向对象程序员,都需要系统地学习面向对象的知识,单纯从编程语言上获得的面向对象知识,不能够胜任面向对象设计与开发。

​ 设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。

对象是什么?

  • 从概念层面讲,对象是某种拥有责任的抽象。 ​- 从规格层面讲,对象是一系列可以被其他对象使用的公共接口
  • 从语言实现层面来看,对象封装了代码和数据。

从设计原则到设计模式

  • 针对接口编程,而不是针对实现编程

    客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口。(客户即调用你程序的程序)

  • 优先使用对象组合,而不是继承

    类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低

  • 封装变化点

    使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。

  • 使用重构得到模式

    设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。

具体的设计原则

  • 单一职责原则(SRP):一个类应该仅有一个引起它变化的原因。

  • 开放封闭原则(OCP):类模块应该是可扩展的,但是不可修改(对扩展开放,对修改封闭)

  • 里氏替换原则(LSP):所有引用基类的地方必须能透明地使用其子类的对象。

  • 接口隔离原则(ISP):不应该强迫客户程序依赖于它们不用的方法

  • 依赖倒置原则(DIP):

    ​ 高层模块不应该依赖于底层模块,二者都应该依赖于抽象。

    ​ 抽象不应该依赖于实现细节,实现细节应该依赖于抽象。

    ​(抽象就是抽象类或接口,细节就是实现类)

依赖倒置使用要点

  • 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备。

  • 变量的表面类型尽量是接口或者抽象类。

  • 任何类都不应该从具体类派生。

  • 尽量不要覆写基类的方法。

  • 结合里氏替换原则使用。

  依赖正置就是类间的依赖是实实在在的实现类间的依赖,也就是面向实现编程,这也是正常人的思维,我要开奔驰车就依赖奔驰车。

  编写程序需要的是对现实世界的事物进行抽象,抽象的结果就是有了抽象类和接口,然后我们根据系统设计的需要产生了抽象间的依赖,代替了人们传统思维中的事物间的依赖,“倒置”就是从这里产生的。

开闭原则使用要点

  • 抽象约束——三层含义

  第一,通过接口实现对扩展开放,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法

  第二,参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;

  第三,抽象层尽量保持稳定,一旦确定即不允许修改。


Comments

Content