2011-04-14 31 views
1

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

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

我有兴趣了解是否有替代方法在视图代码中打开模型的具体类。这种感觉不对,因为它使用条件逻辑,我认为它应该可以依赖于多态,但我很难想出一个更好的主意。有没有建立模式来解决这个问题?

(我显然不希望实现模型视图逻辑,因为这将被混合的责任,因为我可能要为每个型号不同的看法)

澄清:如何在模型层中建模不同的事件类型不是问题。有几种众所周知的面向对象解决方案。问题涉及视图代码,它负责直观地呈现模型。我想我有一个EventView类来处理显示事件(模型)。问题是:如何实现这个类没有切换块,根据事件的具体类型选择不同的代码路径是渲染。

+1

听起来像你只想使用继承。有一个具有所有常用属性的基类,然后让您的具体实现从您的基类继承。 – 2011-04-14 12:12:58

+0

@Evan显然我在模型层使用继承来实现多态。问题涉及视图代码。 – KaptajnKold 2011-04-14 12:27:30

+0

任务陈述太少。班级的责任和合作者是什么?在最简单的情况下,它可能是带有对EventType类的引用的单个Event类的实例。 – 2011-04-14 13:01:56

回答

1

好像你有一些DoubleDispatch关注点在这里。

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

HtmlString getHtmlView() { /* code */ } 

但随后事件有鉴于知识和我们每添加一个新的观点,我们添加一个新的getXXXView()方法时。我同意这看起来不愉快。

因此,我们可以通过具有提高分离关注的所有事件提供

HtmlViewMaker getHtmlMaker { return new MyKindOfViwer(this); } 

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

但是我们仍然有一个问题:每种新的视图都需要一个新的getXxxMaker方法。所以我们开始考虑更复杂的工厂以及泛型和模板的使用等等。

0

对我来说,我只是使用局部视图的概念。基类由主视图处理,而主视图需要一个局部视图来处理显示具体类的需要。

+0

知道需要哪个局部视图? – KaptajnKold 2011-04-14 13:26:55

+0

您翻转它以便“具体视图”是主要视图,它们都需要“基本视图”。 – cdeszaq 2011-04-14 15:08:54