设计模式之美--面向对象

从面向对象开始

面向对象编程是一种编程范式或者编程风格。它以类或者对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为编程设计和实现的基石。

面向对象编程语言,支持类或者对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程的四大特性的编程语言。

面向对象分析就是要清楚要做什么,面向对象设计就是要搞清楚怎么做。两个阶段最终的产物是类的设计。包括程序被拆解为哪些类,每个类有哪些属性方法,类和类之间如何交互等等。

封装

WHAT: 隐藏信息,保护数据访问。
HOW: 通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。
WHY: 一方面,保护数据不被随意修改,提高代码的可维护性;另一方面,仅仅暴露有限的必要接口,提高类的易用性。

抽象

WHAT: 隐藏方法的具体实现,让使用者只需要关心提供了哪些功能,不需要知道实现。
HOW: 通过接口类或者抽象类实现。特殊语法机制,非必须。
WHY: 一方面,提高了代码的可拓展性、维护性,修改实现不需要改变定义,减少了代码的改动范围;另一方面。也是处理复杂系统的有效手段,能够有效的过滤掉不必要关注的信息。

继承

WHAT: 继承用来表示 is-a关系。主要有单继承和多继承。(多继承会有菱形继承问题)
HOW: 需要编程语言提供特殊的语法机制,比如Java的extends,C++的
WHY: 解决代码复用的问题。

多态

WHAT: 子类可以替换父类,在实际代码运行中,调用子类的方法进行实现。
HOW: 特殊机制,比如继承,接口类,duck-typing。
HWHY: 多态可以提高代码的可拓展性和复用性,遵循 对修改关闭,对拓展开放的设计原则。是很多设计模式,设计原则,编程技巧的代码实现基础。

面向对象相比面向过程的优势

  1. 面向对象(OOP)能够应对大规模复杂程序的开发,可以在应对复杂程序开发的时候,思路更加清晰。
    程序处理流程并非单一的一条主线,而是错综复杂的网状结构。通过面相对象的方式,先去思考如何给业务建模,如何将需求翻译为类,如何给类之间建立交互关系。有了类的设计之后,然后再像搭积木一样,按照处理流程,再进行组装。

  2. OOP风格的代码更易服用,易扩展,易维护。因为四大特性,可以极大的满足复杂的编程需求

  3. OOP语言更加人性化,更加高级,更加智能。面向过程是一种计算机思维模式,而面向对象是一种replied额思维模式。我们在思考,如何给业务建模,如何将真实的世界映射为类或者对象,这让我们更加能够聚焦到业务本身,而不是思考如何跟机器打交道。

哪些代码看似面向对象,实际面向过程?

  1. 滥用getter,setter方法,破坏封装

  2. 滥用全局变量和全局方法,如Constants类、Utils类的设计问题。尽量细化成小类,如果能将这些类的属性和方法,划分到其他业务类中,能更好的提高类的内聚性和可复用性.

  3. 基于贫血模型的开发模式。数据和操作是分开定义在VO/BO/Entity 和 Controller/Service/Repository中的。