知识卡片

视图模式的两个独立选择维度

结构图卡

内容

选择视图方案实际上要做两个互相独立的决定。第一个决定:转换视图还是模板视图。模板视图允许直接在网页结构里编写表现层、嵌入标签指明动态内容该填到哪里(ASP、JSP、PHP等服务器页面技术都基于此),功能强大灵活,但如果不刻意约束(比如把程序逻辑抽到独立的辅助对象里),很容易让代码和页面结构混成一团、难以维护;转换视图走的是”转换”风格(典型如XSLT),如果领域数据本身是XML格式(或容易转换成XML),输入控制器只需挑选合适的样式表、应用到模型收集的XML数据上即可,效果很好。第二个决定,与第一个决定正交:用单阶视图还是两步视图。单阶视图通常是”一个屏幕对应一个视图组件”,视图直接从领域数据提取内容、生成HTML。两步视图把这个过程拆成两段:先由领域数据生成一个与展现技术无关的”逻辑屏幕”,再把这个逻辑屏幕交给第二阶段渲染成HTML——好处是要改变全局的HTML呈现方式时,只需改动这个共享的第二阶段目标对象,前提是各处屏幕本身共享相似的逻辑设计(如果站点设计得过于精细、各屏幕差异很大,就很难提炼出统一的逻辑屏幕结构);两步视图尤其适合同一套逻辑要服务多种前端外观的场景,比如多家航空公司共用同一套后台订票系统、各自换一套第二阶段呈现,或是要同时支持浏览器和掌上设备这类差异很大的输出终端——当两个界面差异过大(如浏览器与手机屏幕),共享逻辑屏幕就基本不可行了。

结构图

flowchart TB
  A["视图方案的两个独立决定"]
  A --> B["决定一:转换视图 vs 模板视图"]
  B --> B1["模板视图:嵌标签写表现层<br/>强大灵活但易与逻辑混杂"]
  B --> B2["转换视图:XSLT等转换风格<br/>适合领域数据本身是XML"]
  A --> C["决定二:单阶视图 vs 两步视图"]
  C --> C1["单阶:一屏幕一视图<br/>直接生成HTML"]
  C --> C2["两步:先生成逻辑屏幕<br/>再统一渲染<br/>适合多前端/多终端共享逻辑"]

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第4章 Web表现层"之"4.1 视图模式"(源文件:_epub-src/OEBPS/Text/000027.html) - 结论依据:原文说明"在视图方面,可以考虑三种模式:转换视图、模板视图和两步视图。这就带来了两种选择:第一,使用转换视图还是模板视图;第二,无论使用哪一种,使用一个阶段,还是两步视图",并分别说明模板视图/转换视图的适用场景和单阶/两步视图的优劣,直接支撑本卡结构图。 - 原始内容:两步视图的优点是它可以决定把什么样的HTML网页用在一个地方。这使得全局改变HTML网页变得很容易……如果Web应用程序提供的服务是由多种前端用户来使用,那么运用两步视图将更加得心应手。