简单来说,你能告诉我“两步视图”和“复合视图”布局设计模式之间的区别吗?
2 回答
复合视图,顾名思义,是视图的复合(如在 GOF 模式中)。这意味着 Composite View 是其他(Composite、Template、Transform等)视图的树形结构,您可以通过根 Composite View 对象统一处理这些视图。
如果客户端分派到根视图,它将分派到树结构中的所有视图,从而创建结果页面。所以在复合视图中,没有两个步骤,而只有一个,因为每个单独的视图都是一步视图(具体的最终输出)。
使用由多个原子子视图组成的复合视图。整体模板的每个子视图都可以动态包含在整体中,页面的布局可以独立于内容进行管理。
在简化的伪代码中:
composite = new CompositeView;
composite.add(new HeaderView(headerData));
composite.add(new TableView(tableData));
…
composite.add(new FooterView(footerData));
composite.render();
这与两步视图的不同之处在于两步视图不是组合,而只是两个执行步骤,首先从域数据到该数据的逻辑屏幕表示,然后到具体的输出格式。也就是说,它将页面的逻辑结构和格式分开。
两步视图通过将转换分为两个阶段来处理这个问题。第一个将模型数据转换为没有任何特定格式的逻辑表示;第二个将逻辑表示转换为所需的实际格式。
在简化的伪代码中:
twoStepView = new TwoStepView;
twoStepView.setData(data);
twoStepView.setFirstStep(new ConcreteScreen);
twoStepView.setSecondStep(new ConcreteHtmlScreen);
twoStepView.transform();
如您所见,两步视图仅编排这两个步骤。例如,如果您的两步视图使用 XSLT,它只会处理从输入 XML 到屏幕 XML 到最终 HTML 输出的转换。Concrete Screen 和 ConcreteHTMLScreen 将成为 XSLT 模板。
我认为“复合视图”是一种设计模式,它建议您通过组合来设计视图,或者组合较小的部分(子视图)来创建整体——这有助于提高可重用性和更好的可维护性。
另一方面,“两步视图”更多是复合视图设计模式的具体实现,主要由 Zend 框架布局驱动。此实现建议您首先定义子视图的所有内容(步骤 1),然后允许layout
在渲染的 HTML 中的适当位置渲染子视图(步骤 2)。
我通常是布局模式的粉丝,但发现两步(并首先定义所有子视图)的想法是有限的。我更倾向于按照 Smarty 3 的扩展/块功能的工作原理来考虑布局:
http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl
像 Smarty 这样的功能在其组成中没有固定数量的步骤 - 即布局可以扩展布局,子视图可以由进一步的子视图组成,等等。
希望有帮助。