Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 多态视图的模式_Oop_Model View Controller_Design Patterns_Polymorphism - Fatal编程技术网

Oop 多态视图的模式

Oop 多态视图的模式,oop,model-view-controller,design-patterns,polymorphism,Oop,Model View Controller,Design Patterns,Polymorphism,假设我有一个抽象的“FriendEvent”模型,它有几个不同的具体实现,即FriendPosted、FriendCommented、FriendUploadedPhoto等。它们都应该在我的FriendEvents视图中呈现,但在视觉上应该彼此不同(例如FriendUploadedPhoto应该包含缩略图) 实现这一点的好的面向对象模式是什么 我很想知道在视图代码中是否有一种替代方法来切换模型的具体类。这感觉有点错误,因为它使用了条件逻辑,我认为应该可以依赖多态性,但我很难想出更好的主意。有没

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

实现这一点的好的面向对象模式是什么

我很想知道在视图代码中是否有一种替代方法来切换模型的具体类。这感觉有点错误,因为它使用了条件逻辑,我认为应该可以依赖多态性,但我很难想出更好的主意。有没有既定的模式来处理这个问题

(我显然不想在模型中实现视图逻辑,因为这会混淆责任,而且我可能希望每个模型都有不同的视图)


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

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

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

这里似乎有一些问题

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

HtmlString getHtmlView() { /* code */ }
但是所有事件都有视图知识,每次我们添加一种新的视图时,我们都会添加一个新的getXXXView()方法。我同意这种看法

因此,我们可以通过提供所有事件来增加关注点的分离

HtmlViewMaker getHtmlMaker {  return new MyKindOfViwer(this); }
现在,至少我们已经将视图代码输出到它自己的类中。是的,我们可能需要为每种/多种事件编写特殊案例代码,但这是不可避免的。我们的第一个问题是把那个特殊的代码放在哪里——我们已经找到了答案

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

似乎您在这里有一些顾虑

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

HtmlString getHtmlView() { /* code */ }
但是所有事件都有视图知识,每次我们添加一种新的视图时,我们都会添加一个新的getXXXView()方法。我同意这种看法

因此,我们可以通过提供所有事件来增加关注点的分离

HtmlViewMaker getHtmlMaker {  return new MyKindOfViwer(this); }
现在,至少我们已经将视图代码输出到它自己的类中。是的,我们可能需要为每种/多种事件编写特殊案例代码,但这是不可避免的。我们的第一个问题是把那个特殊的代码放在哪里——我们已经找到了答案


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

听起来您只想使用继承。创建一个具有所有公共属性的基类,然后让您的具体实现从基类继承。@Evan显然我在模型层中使用继承来实现多态性。问题涉及视图代码。任务语句太少。班级的职责和合作者是什么?在最简单的情况下,它可能是引用EventType类的单个事件类的实例。我设想您将有某种view()/display()方法或其他东西来显示当前视图,这将是您用来为FriendPosted/FriendCommented子类的基类的实例,“等等。这有意义吗?”乔治,我不知道我是否明白。您是否认为每种类型的事件都知道如何显示自己?听起来您只想使用继承。创建一个具有所有公共属性的基类,然后让您的具体实现从基类继承。@Evan显然我在模型层中使用继承来实现多态性。问题涉及视图代码。任务语句太少。班级的职责和合作者是什么?在最简单的情况下,它可能是引用EventType类的单个事件类的实例。我设想您将有某种view()/display()方法或其他东西来显示当前视图,这将是您用来为FriendPosted/FriendCommented子类的基类的实例,“等等。这有意义吗?”乔治,我不知道我是否明白。您是否建议每种类型的事件都知道如何显示自己?它如何知道需要哪种局部视图?您翻转它,使“具体视图”成为主要视图,它们都需要“基本视图”。它如何知道需要哪种局部视图?您翻转它,使“具体视图”成为主要视图,它们都需要基本视图“基本视图”。