知识卡片

表现层选型的决策框架

结构图卡

内容

表现层的选择在很大程度上独立于下层选择。第一个决定是胖客户界面还是HTML浏览器界面——胖客户体验更好,但代价是要自己负责客户端软件的控制和部署管理;作者的立场很明确:能用HTML浏览器就尽量用,实在不行才上胖客户端(本书也不讨论胖客户端相关的模式,选了这条路就超出本书范围)。走HTML路线后,建议以模型-视图-控制器为设计基础,剩下要做的只有两个决定:选控制器、选视图。控制器的选择很多时候被开发工具直接左右——用Visual Studio最简单的路径是页面控制器配模板视图;用Java可以借助Struts这类流行Web框架,走前端控制器配模板视图的路子。如果不被工具绑定、还有自由选择空间,站点偏文档型(尤其是静态页面和动态页面混杂)时更推荐页面控制器;站点导航和UI逻辑更复杂时则更适合前端控制器。视图的选择主要是模板视图还是转换视图,这很大程度上取决于开发团队更习惯服务器页面技术还是XSLT——作者虽然欣赏转换视图额外带来的可测试性,但整体上仍然略微偏向模板视图;如果站点需要支持多种表现形式,则应该考虑叠加两步视图。与下层的通信方式,取决于”要通信的是哪一层”和”是否同一进程”这两个因素:能放进同一个进程就尽量放,省去低效的进程间通信;实在无法同进程时,才用远程外观包装领域逻辑层、配合数据传输对象与Web服务器通信。

结构图

flowchart TB
  A["表现层决策"]
  A --> B["胖客户端 vs HTML浏览器<br/>优先HTML,除非确实需要胖客户端"]
  A --> C["控制器:页面控制器 vs 前端控制器<br/>文档型站点→页面控制器<br/>复杂导航→前端控制器<br/>(受工具/框架左右)"]
  A --> D["视图:模板视图 vs 转换视图<br/>取决于团队熟悉服务器页面还是XSLT<br/>多表现形式→叠加两步视图"]
  A --> E["与下层通信:同进程优先<br/>否则用远程外观+数据传输对象"]

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第8章 通盘考虑"之"8.3 表现层"(源文件:_epub-src/OEBPS/Text/000054.html) - 结论依据:原文说明"我的观点是:如果情况允许,尽可能使用HTML浏览器方式……如果你使用的是Visual Studio,最简单的方法是用页面控制器和模板视图。如果你使用的是Java……用一些Web框架,比较流行的如Struts,它会帮助你运用前端控制器和模板视图……如果可能,我建议将所有的东西运行在一个进程中……可以将领域逻辑层用远程外观包装,然后使用数据传输对象实现与Web服务器的通信",直接支撑本卡结构图。 - 原始内容:如果选择范围比较宽裕,且你的站点更多的是面向文档,那么我推荐使用页面控制器……如果站点的导航机制和UI更为复杂,则可以考虑使用前端控制器。