当前位置: 首页 > 知识库问答 >
问题:

MVC:为什么控制器是视图的策略

云焱
2023-03-14

这是策略模式的定义:

策略-定义了一系列算法,封装了每一个,并使它们可以互换。策略允许算法独立于使用它的客户端而变化。

所以,策略将功能分为两部分:一部分不会更改,另一部分在将来某个时间可以更改。

在MVC中,他们说:

控制器是视图的策略

这意味着控制器是变化的,视图将来可能不会改变。

我还不太明白。我认为他们两个将来都可以改变。

请给我解释一下人们为什么这么说。

共有1个答案

毕和志
2023-03-14

我怀疑您可能已经看到了C3 wiki部分中关于模型视图控制器作为聚合设计模式的注释“控制器是视图的策略”,这很有趣,但有点简洁。

在设计模式的介绍中对这一想法进行了更全面的描述,其中关于MVC的部分说:

MVC还允许您更改视图响应用户输入的方式,而无需更改其视觉表示。例如,您可能希望更改它对键盘的响应方式,或者让它使用弹出菜单而不是命令键。MVC将响应机制封装在控制器对象中。控制器有一个类层次结构,可以很容易地在现有控制器的基础上创建一个新的控制器。

视图使用控制器子类的实例来实现特定的响应策略;要实现不同的策略,只需使用不同类型的控制器替换实例。甚至可以在运行时更改视图的控制器,让视图更改其响应用户输入的方式。例如,可以通过为视图提供忽略输入事件的控制器来禁用视图,使其不接受输入。

视图-控制器关系是策略设计模式的一个示例。策略是表示算法的对象。当您想要静态或动态替换算法时,当您有很多算法变体时,或者当算法具有您想要封装的复杂数据结构时,它很有用。

综上所述,您可以对不同的控制器使用相同的视图,以在系统的不同部分具有不同的行为,您可以在运行时替换控制器以启用或禁用特定功能,并且控制器封装了更新模型的复杂交互。

 类似资料:
  • 本文向大家介绍ASP.NET MVC 控制器与视图,包括了ASP.NET MVC 控制器与视图的使用技巧和注意事项,需要的朋友参考一下 一、控制器相关 在Controller类中方法访问级别为public的方法,就是行为(Action).如果不希望Controller类中的方法成为Action(可以在地址栏中被访问),有两种实现方式:将方法的访问级别设置为private在方法上添加特性标记[Non

  • 我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。 说像我已经... ViewControlllerA ViewControlllerB 我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如""。 下面是代码。。。 视图控制器 ViewControllerB只是一个带有标签的简单屏幕。 视图控制器B 编辑

  • 以下的一段代码相当于定义一个ParameterizableViewController视图控制器的快捷方式,该控制器会立即将一个请求转发(forwards)给一个视图。请确保仅在以下情景下才使用这个类:当控制器除了将视图渲染到响应中外不需要执行任何逻辑时。 以下是一个例子,展示了如何在MVC Java编程配置方式下将所有"/"请求直接转发给名字为"home"的视图: @Configuration

  • 问题内容: 我没有找到有关此问题的文章,但没有一个解决我的问题。 就像我说的那样。 ViewControllerA ViewControllerB 我试图将添加为的子视图,但是它 抛出类似“ ” 的错误。 下面是代码… ViewControllerA ViewControllerB只是一个带有标签的简单屏幕。 ViewControllerB EDIT 根据用户答案的​​建议解决方案,ViewCon

  • 我试图从xml配置转移到java配置。应用程序启动时不会出现任何错误,但是当内容不同时,jsp返回$END$。 我相信我在某个地方犯了一些愚蠢的错误,没有抛出异常 注意:使用xml配置时,一切正常 配置类 初始值设定项类 控制器

  • 问题内容: 我已经使用Xcode 11,Beta 5为iOS 13手动设置了根视图控制器。在部署信息中删除了对main的引用,包括在info.plist中删除了对main的引用,而我从未发现自己必须在iOS 13之前做。窗口在SceneDelegate中完成,嵌套在willConnectTo函数中。通常,如果我错过了某个步骤,该应用程序将崩溃。现在,我得到了一个空白的黑屏,而不是看到我的视图控制器