美文网首页全栈工程师修炼指南
唯有套路得人心:谈谈Java EE的那些模式

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

作者: 码农架构 | 来源:发表于2020-11-13 10:55 被阅读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)”这样的现象联系起来。

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

    扩展阅读

    • 文中提到了 Java EE 平台的一系列标准和技术,维基百科上有一个简单的列表供参考。
    • Core J2EE Patterns: Best Practices and Design Strategies 这本书对于你学习 Java EE 的模式会提供不错的指导性帮助,属于权威之一,但是内容比较抽象,如果你在设计方面有一定追求,它是很好的阅读材料。好几年前我曾经读过纸质的第一版,但这是第二版,已经可以在网上公开阅读。
    • 如果对于文中提到的 Struts 拦截器感兴趣,请看 Struts 官方文档中对于拦截器的介绍
    • 文中提到了抽象泄露的概念,如果你感兴趣的话,请阅读 The Law of Leaky Abstractions,作者 Joel Spolsky 就是那本著名的《软件随想录》的作者。
    • MyBatis 的官网,是的,MyBatis 的教程我就推荐官网上的,清晰简洁,而且具备中文版,不需要去找什么第三方的资料了;如果是需要中文的 Hibernate 入门资料,我推荐 W3Cschool 上的 Hibernate 教程
    公众号:码农架构

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/vwdlbktx.html