全栈工程师修炼指南

唯有套路得人心:谈谈Java EE的那些模式

2020-11-13  本文已影响0人  码农架构

背景和概念

我相信很多人都接触过面向对象模式,可是,模式是个通用词,面向对象只是其中的一个分支而已。事实上,我们本章的重点 MVC 本身就是一种典型的模式,介绍过的 CQRS 是模式,学习过的 AOP、IoC,这些其实也都是模式。

世界上没有任何一门语言,像 Java 一样,几乎一直被黑,但是生态圈一直在壮大,且在工业界具备如此统治力。很多人说,Java 是一门平庸的语言,这可能没错,但是它对于底层细节的封装和语言本身的难度做到了很好的平衡,它不一定会有多精巧、多出彩,但是新手也可以顺利完成工作,且不容易写出破坏性强、其他人难以接手的代码,这对于要规模、要量产的工业界来说,简直是超级福音。

使用 Java 的人可以快速上手,也可以把精力专注在高层的架构和设计上面,这就是为什么使用 Java 的人往往对模式特别敏感的原因。

概览

Java EE 的模式涉及的面非常广泛,下图是来自经典的 Core J2EE Patterns: Best Practices and Design Strategies 一书,对我们从宏观上理解 Java EE 模式有一定的指导意义。但是请不要以为这就是一个完整的 Java EE 的模式列表,它只是列出了在当时比较常见的那一些而已。

image.png

从图中我们可以看到,这些“核心模式”大致分为呈现层(Presentation Tier,绿色部分)、业务层(Business Tier,紫色部分)和集成层(Integration Tier,红色部分)三大部分,模式之间有的通过实线箭头连接,表示着不同模式之间的单向关联关系,有的通过虚线箭头连接,表示着模式之间“使用包含”的依赖关系。

这里面的内容其实有很多在本章已经涉及到了,比如 Front Controller 和 Business Object,但是,我还想补充和细化其中的两个模式,它们在网站开发的项目中非常常用:Intercepting Filter 和 Data Access Object。

拦截过滤器

拦截过滤器(Intercepting Filter)正如图中的“Apply zero or more”和 Servlet 规范所述一样,应当具备一个链式结构。这个链式结构中的每个过滤器,互相之间应当是一个互不依赖的松耦合关系,以便于组合容易。这个过滤器链条,出现的位置通常在控制器 Front Controller 之前,在还没有进行到 Servlet 的 URL 映射前,请求需要先通过它的过滤逻辑。

数据访问对象

DAO(Data Access Object)本质上是能够为某种特定数据持久化的机制提供抽象结构的对象。虽然我们谈论 DAO 基本上是默认这里的数据持久化的介质就是数据库,但需要明确的是,实际上并没有这样的约束。换句话说,DAO 可以把数据持久化到数据库中,但也可以持久化到文件里,甚至会以网络请求的方式把数据持久化到某个远程服务中去。

但事物都有两面性,DAO 也不是完美的,比如说,多加一层就会从额外的抽象层次上带来软件的复杂性,它经常和“抽象泄露(Leaky Abstraction)”这样的现象联系起来。

这里是说,理想状况下,程序员只需要关心“某一抽象层之上”的逻辑和调用,这也是我们分层的一大好处。可是,现实总是和理想有距离的,一旦抽象之下的部分出错,程序员很可能必须去了解和深入这部分的内容,这就违背了抽象分层的初衷,但是在很多情况下这是不可避免的,这也是整个软件体系日渐复杂,我们需要学习的内容越来越多的原因之一。

扩展阅读

公众号:码农架构
上一篇下一篇

猜你喜欢

热点阅读