MVC:两步和复合视图模式之间的差异

Posted

技术标签:

【中文标题】MVC:两步和复合视图模式之间的差异【英文标题】:MVC: Differences Between Two-Step and Composite View Patterns 【发布时间】:2012-11-14 17:23:19 【问题描述】:

简单来说,你能告诉我“两步视图”和“复合视图”布局设计模式之间的区别吗?

【问题讨论】:

【参考方案1】:

Composite View,顾名思义,是视图的Composite(在 GOF 模式中)。这意味着复合视图是其他(复合、Template、Transform、...)视图的树结构,您可以通过根复合视图对象统一处理。

如果客户端分派到根视图,它会分派到树结构中的所有视图,从而创建结果页面。所以在复合视图中,没有两个步骤,而只有一个,因为每个单独的视图都是一步视图(具体的最终输出)。

使用由多个原子子视图组成的复合视图。整体模板的每个子视图都可以动态包含在整体中,页面的布局可以独立于内容进行管理。

在简化的伪代码中:

composite = new CompositeView;
composite.add(new HeaderView(headerData));
composite.add(new TableView(tableData));
…
composite.add(new FooterView(footerData));
composite.render();

这与Two-Step-View 的不同之处在于,两步视图不是复合,而只是两个执行步骤,首先从域数据到该数据的逻辑屏幕表示,然后到具体的输出格式。也就是将页面的逻辑结构和格式分开。

两步视图通过将转换分为两个阶段来处理此问题。第一个将模型数据转换为没有任何特定格式的逻辑表示;第二个将逻辑表示转换为所需的实际格式。

在简化的伪代码中:

twoStepView = new TwoStepView;
twoStepView.setData(data);
twoStepView.setFirstStep(new ConcreteScreen);
twoStepView.setSecondStep(new ConcretehtmlScreen);
twoStepView.transform();

如您所见,两步视图仅协调这两个步骤。例如,如果您的两步视图使用 XSLT,它只会处理从输入 XML 到屏幕 XML 到最终 HTML 输出的转换。 Concrete Screen 和 ConcreteHTMLScreen 将成为 XSLT 模板。

【讨论】:

【参考方案2】:

我认为“复合视图”是一种设计模式,它建议您通过组合来设计视图,或者组合较小的部分(子视图)来创建整体 - 这有助于提高可重用性和更好的可维护性。

另一方面,“两步视图”更多是复合视图设计模式的具体实现,主要由 Zend 框架布局驱动。此实现建议您首先定义子视图的所有内容(第 1 步),然后允许 layout 在呈现的 HTML 中的适当位置呈现子视图(第 2 步)。

我通常是布局模式的粉丝,但我发现两步(并首先定义所有子视图)的想法是有限的。我更倾向于按照 Smarty 3 的 Extends/Block 功能的工作原理来考虑布局:

http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl

像 Smarty 这样的功能在其组合中没有固定数量的步骤 - 即布局可以扩展布局,子视图可以由更多的子视图组成,等等。

希望对您有所帮助。

【讨论】:

以上是关于MVC:两步和复合视图模式之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

iOS设计模式初识-02

MVC中视图和模型之间的通信

传统的MVC设计模式

Django初探

SpringMVC

django 基础 学习