c# - GRASP 的 Controller 到底是什么?

标签 c# java design-patterns controller grasp

Grasp 的 Controller 模式背后的想法是什么?

我目前的解释是,有时你想要实现一些需要使用几个类的东西,但这些类中没有一个可以或无法访问完成它所需的信息,所以你创建一个新类来完成这项工作,引用所有需要的类(这可能是信息专家)。

这是对 Grasp Controller 的正确看法吗?

通常在谷歌搜索或 SO'ing Controller 时,我只会得到关于 MVC(以及诸如此类)的结果,这些是我不了解的主题,所以我想要的答案不假设我知道 ASP.NET 的 MVC或者什么:(

谢谢

最佳答案

根据 Wikipedia :

A Controller object is a non-user interface object responsible for receiving or handling a system event.

来自 Applying UML and Patterns :

What first object beyond the UI layer first receives and coordinates ("controls") a system operation?

Controller ,全面 - 无论是 MVC 还是 GRASP 或 Patterns of EAA - 都是关于接收输入和响应事件。

我从字面上将其概念化:想想视频游戏 Controller NES controller

它响应输入事件——用户按下按钮。当您按下按钮时,它不一定知道要做什么,但它至少会收到事件。

查看 Controller ,可以很容易地弄清楚系统事件是什么 - 也就是说它响应什么输入以及用户如何与系统交互。在任天堂 Controller 上,很明显系统事件是:

  • A
  • B
  • X
  • Y
  • L
  • R

如果我们要处理所有这些事件并构建一个软件 Controller 来处理它们,它将是一个 MVC Controller :这些事件都与呈现给用户的物理 Controller 有关 - 它是“ View ”,如果你将要。但是大多数视频游戏都有第二层输入事件,其中按钮混搭映射到特定的系统操作。例如,如果您在 Mortal Kombat 2 中扮演 Scorpion,则按 ← ← B 会触发您的一项特殊 Action 。在这种情况下,系统可能需要不同的 Controller 来处理这些不同类型的事件:

UML diagram of various controller classes - a Button Controller with methods for each button press, and then various controller objects for different playable characters. Each player controller exposes methods corresponding to the character's special moves.

在这里,NES 按钮 Controller 是一个 MVC Controller ,它会跟踪 UI 元素的状态 - 例如,记住按什么顺序按下了哪些按钮。根据应用程序状态(参见 Application Controller - 另一个!)NES Button Controller 将通过调用其他 Controller 上的方法来响应某些按钮组合 - 例如 Scorpion Controller - 这是用例 Controller 。

重要的是,通过查看这些 Controller 对象的设计,您可以快速轻松地枚举它们响应的系统事件。

总而言之,MVC Controller 最终仍然是一种 GRASP Controller ——因为它的方法倾向于表示响应用户输入的系统事件。但是还有其他不是 MVC Controller 的 GRASP Controller :用例 Controller 。 GRASP 用例 Controller 可能会响应系统事件,例如“用户创建新销售”,而 MVC Controller 会响应“系统接收到 /sales/new 的 PUT 请求”或“a java.awt.event.ActionEvent 触发`"。

关于c# - GRASP 的 Controller 到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2961876/

相关文章:

model-view-controller - 新的 Web 应用程序应该遵循 MVC 还是 MVP 模式?

Scala - 在伴随对象中实现 "manager"模式?

c# - Web API 脚手架 + MVC View

c# - 将嵌套的 'foreach' 和 'If' 重构为 LINQ

c# - net core 2 无法加载资源 : the server responded with a status of 404 (Not Found)

java - 切换 JTextField 可见性

c# - WCF 异步服务器端处理

java - Spring Batch 不会在 block 流中同时调用 ItemProcessor 和 ItemWriter

java - 实现精确的时间相关顺序执行的好方法是什么?

c++ - 正确使用抽象工厂C++