问题描述
|
想象一下,我有一个抽象的“ FriendEvent”模型,该模型具有几种不同的具体实现。 FriendPosted,FriendCommented,FriendUploadedPhoto等。它们都应在我的FriendEvents视图中呈现,但在视觉上应彼此区分开(例如FriendUploadPhoto应该包含缩略图)。
什么是实现此目标的良好的面向对象模式?
我有兴趣了解是否有替代方法可以在视图代码中打开模型的具体类。这有点不对劲,因为它使用条件逻辑,我认为应该可以依靠多态,但是我很难想出一个更好的主意。有没有建立的模式可以解决这个问题?
(我显然不想在模型中实现视图逻辑,因为那样会混合职责,并且因为每个模型我都希望有不同的视图)
需要澄清的是:如何在模型层中对不同事件类型进行建模不是问题。有几种众所周知的OO解决方案。问题与负责可视化呈现模型的视图代码有关。我想我有一个EventView类,用于显示事件(模型)。问题是:如何在不使用根据事件的具体类型选择其他代码路径的开关块的情况下实现此类。
解决方法
似乎您在这里有一些DoubleDispatch问题。
如果我对您的理解正确,那么您将尝试避免将模型和视图混合使用。每个事件类可以具有
HtmlString getHtmlView() { /* code */ }
但是所有事件都具有视图知识,并且每当我们添加一种新的视图时,我们都会添加一个新的getXXXView()方法。我同意这令人不快。
因此,我们可以通过提供所有事件来增加关注点的分离
HtmlViewMaker getHtmlMaker { return new MyKindOfViwer(this); }
现在至少我们已经将View代码放到了自己的类中。是的,我们很可能需要为每种/多种事件编写特殊案例代码,但这是不可避免的。我们的第一个问题是在哪里放那个特殊的代码-我们有一个答案。
但是,我们仍然有一个问题:每种新的View都需要一个新的getXxxMaker方法。因此,我们开始研究更复杂的工厂以及泛型和模板的使用等。
,对我来说,我只会使用局部视图的概念。基类由主视图处理,并且该主视图需要局部视图,该局部视图照顾了显示具体类的需求。