Grasp控制器模式背后的想法是什么?
我目前的解释是,有时你想要实现需要使用几个类的东西,但这些类中没有一个可以或者有权访问所需的信息,所以你创建了一个新的类来完成这项工作,引用所有需要的类(这可能是信息专家)。
这是对Grasp控制器的正确看法吗?
一般来说,谷歌搜索或SO'ing控制器,我只是得到关于MVC(和诸如此类)的结果,这是我不理解的主题,所以我想答案不要假设我知道ASP.NET的MVC或某事:(
由于
答案 0 :(得分:7)
根据Wikipedia:
Controller对象是负责接收或处理系统事件的非用户界面对象。
UI层之外的第一个对象首先接收并协调(“控制”)系统操作?
控制者,无论是MVC还是GRASP,还是Patterns of EAA - 都是关于接收输入和响应事件的。
我从字面上理解它:想想一个视频游戏控制器。
它响应输入事件 - 用户按下按钮。当你按下按钮时,它不一定知道该怎么做,但它至少会收到这个事件。
查看控制器,可以轻松找出系统事件是什么 - 也就是说它响应的输入以及用户与系统的交互方式。在任天堂控制器上,很明显系统事件是:
A
B
X
Y
↑
↓
→
←
L
R
如果我们要采取所有这些事件并构建一个软件控制器来处理它们,它将是一个MVC控制器:这些事件都与呈现给用户的物理控制器有关 - 它是“视图”,如果你将。但是大多数视频游戏都有第二层输入事件,其中按钮糖化映射到特定的系统操作。例如,如果你在真人快打2中扮演蝎子,按← ← B
会触发你的一个特殊动作。在这种情况下,系统可能需要不同的控制器来处理这些不同类型的事件:
这里,NES Button Controller
是一个MVC控制器,可以跟踪UI元素的状态 - 例如,记住按什么顺序按下了哪些按钮。根据应用程序状态(参见Application Controller - 另一个!),NES Button Controller
将通过调用其他控制器上的方法来响应某些按钮组合 - 例如Scorpion Controller
- 这是用例控制器
重要的是,通过查看这些控制器对象的设计,您可以快速轻松地枚举它们响应的系统事件。
总而言之,MVC控制器最终仍然是一种GRASP控制器 - 因为它的方法往往代表响应用户输入的系统事件。但是还有其他GRASP控制器不是MVC控制器:用例控制器。 GRASP用例控制器可能响应系统事件,例如“用户创建新的销售”,而MVC控制器将响应“系统收到/sales/new
的PUT请求”或“java.awt.event.ActionEvent
点火”等事件`”。
答案 1 :(得分:1)
模型包含数据。视图显示数据。
视图使用Gang of Four Listener模式听模型。
控制器决定如何处理用户输入。他们要么在模型上调用方法,要在当前模型集中构造新对象,从当前模型集中删除对象,将视图重新连接到不同模型,添加视图,删除视图或重新配置视图。
GRASP只是一种更好地理解软件的工具,并且希望通过良好的设计实践防止人们在创建新软件时犯下明显的错误。它与MVC无关,但它可以用来更好地理解MVC。
MVC中的关键是模型不会受到处理显示细节的代码的污染。这样你就可以单独在模型中隔离“业务逻辑”或“类应该做什么”。视图会对模型中的更改做出反应,因为模型会向每个已针对模型注册的视图(侦听器模式)发送消息。消息通常很简洁,基本上不需要包含除“模型已更改”之外的任何数据。
当视图收到模型中发生更改的通知时,视图会从模型的公共接口获取必要的数据。一旦视图具有所需的数据,它就会向用户显示数据(使用视图要支持的任何接口)。这会将数据的表示隔离到一个类,该类在视图更改不兼容时会中断,并允许修改视图代码而不需要模型类进行“兼容性”修改。
控制器负责了解焦点的位置以及要更新的模型或视图。它是将事物放在一起的粘合剂,负责正确处理输入。