本文是阅读《设计模式之美》的总结和心得,跳过了书中对面试和工作用处不大或不多的知识点,总结总共分为三章,分别是面对对象编程范式、设计原则和设计模式

现如今,编程范式存在三种,它们分别是面向对象编程、面向过程编程和函数式编程。其中面向对象编程是目前最流行的,因为随着互联网技术的不断发展,应用程序的体量越来越大,代码行数越来越多,面对对象编程范式拥有的封装、抽象、继承和多态特性在面对大型系统的时候,可以让程序员更容易设计和组织出高内聚、低耦合、易扩展和已读的代码。

四大特性

封装

封装也称为信息隐藏或数据访问保护。在 Java 类中会存在成员变量,利用 Java 语言提供的访问修饰符 private 可以限定只能本类可以访问,其他类对封装在该类中的变量一无所知。
然后我们通过提供 public 访问修饰符修饰的方法供其他类访问,在定义 public 类型的方法时我们要注意不能给所有的成员变量创建 getter setter 方法,这样就相当于将变量以 public 来修饰了,我们应该只提供给外界需要的公共方法,尽量不要让外界直接访问类的成员变量。

抽象

抽象是隐藏方法的内部实现,让调用者只需要关心方法提供了什么功能,并不需要知道这个功能是如何实现的。
除了使用接口和抽象类来实现抽象特性之外,还可以用 “函数” 这一语法机制实现。通过函数包裹具体的实现逻辑,这本身就是一种抽象。大多数编程语言都提供了 “函数” 这一基础的语法机制。因此,抽象没有很强的 “特异性”,因此在很多图书中介绍面向对象编程的时候只介绍封装、继承、多态三种特性。

继承

继承分为单继承和多继承,Java 语言认为多继承会增加代码的复杂性,所以只提供了单继承的语法机制。同时在设计原则中有一条 “多用组合,少用继承”,也说明过度使用继承会导致代码的可读性和可维护性变差。
继承用来表示类之间的 is-a 关系,如猫是一种哺乳动物,子类继承父类,子类可以拥有父类中 public 和 protected 修饰的变量和方法,子类无需重复定义公共的方法,由此可知,继承的主要作用是代码复用。

多态

多态是指,在代码运行过程中,我们可以用子类替换父类,并调用子类的方法。多态可以通过继承来实现,也可以通过接口来实现。
如果一个接口 A,它的实现类有 B、C、D,现在需要定义一个 print 方法来打印它们,如果没有多态,那么我们要实现三个方法,分别是 print(B b),print(C c),print(D d);而如果使用多态我们就只需要定义一个方法 print(A a)。由此可见,多态和继承一样,它的出现也提高了代码的复用性。
同时,多态也是很多设计模式、设计原则的代码实现基础,如策略模式、基于接口而非实现编程、依赖倒置。

“贫血”模型和“充血”模型

很多业务系统是基于 MVC 三层架构开发的。实际上,更确切地讲,这是一种基于 “贫血” 模型的 MVC 三层架构开发模式。虽然这种开发模式已经称为标准的 Web 项目的开发模式,但它违反了面向对象编程风格,是彻彻底底的面向过程编程风格。基于领域驱动设计(Domian Drive Design,DDD)开发模式的 MVC 三层机构开发模式才称得上是面向对象编程风格。
在 MVC 三层架构中,三层分别是展示层 Controller、逻辑层 Service、数据层 Repository。业务逻辑的代码全部分布在 Service 层,整个代码的设计流程如下:
Repository(Entity)》Service(convert(Entity)=Bo)》Controller(convert(Bo)=Vo)

其中 Bo 是 Business Object,在这里,它只包含数据,不包含业务逻辑,这种数据和方法不在一个类中的编程风格就是面向过程编程风格。
与基于 DDD 开发模式的 MVC 三层架构相比,两者唯一的不同就是 “充血” 模型中的 Bo 既包含数据又包含业务逻辑方法。
可以这样理解,将基于 “贫血” 模型中 Service 层的业务逻辑代码抽取到 Bo 中就可以实现 “贫血” 到 “充血” 的转换。