多态视图的模式

时间:2011-04-14 11:53:05

标签: oop model-view-controller design-patterns polymorphism

想象一下,我有一个抽象的“FriendEvent”模型,它有几个不同的具体实现,即。 FriendPosted,FriendCommented,FriendUploadedPhoto等。它们都应该在我对FriendEvents的视图中呈现,但应该在视觉上彼此不同(例如,FriendUploadPhoto应该包含缩略图)。

有什么好的面向对象模式来实现这一目标?

我有兴趣了解是否有替代方法可以在视图代码中切换模型的具体类。这在某种程度上是错误的,因为它使用条件逻辑,我认为应该可以依赖多态,但我很难想出一个更好的主意。有没有确定的模式来解决这个问题?

(我显然不希望在模型中实现视图逻辑,因为这将混合责任,因为我可能希望为每个模型提供不同的视图)

澄清:如何在模型层中建模不同的事件类型不是问题。有几种众所周知的OO解决方案。问题涉及负责视觉呈现模型的视图代码。我想我有一个EventView类来处理显示事件(模型)。问题是:如何在没有切换块的情况下实现此类,该切换块根据事件的具体类型选择不同的代码路径。

2 个答案:

答案 0 :(得分:1)

好像你在这里有一些DoubleDispatch问题。

如果我理解正确,您正试图避免混合模型和视图。每个Event类都可以有

HtmlString getHtmlView() { /* code */ }

但是所有事件都有视图知识,每次添加新视图时我们都会添加一个新的getXXXView()方法。我同意这看起来很不愉快。

因此,我们可以通过举办所有活动来增加关注点的分离

HtmlViewMaker getHtmlMaker {  return new MyKindOfViwer(this); }

现在至少我们已经将View代码放到了自己的类中。是的,我们可能需要为每种/多种事件编写特殊的案例代码,但这是不可避免的。我们的第一个问题是在哪里放置特殊代码 - 我们已经得到了答案。

但是我们仍有问题:每种新的View都需要一个新的getXxxMaker方法。因此,我们开始研究更复杂的工厂以及泛型和模板等的使用。

答案 1 :(得分:0)

对我来说,我只会使用局部视图概念。基类由主视图处理,主视图需要部分视图来满足显示具体类的需要。