我是否需要在这种情况下制作自定义事件?

时间:2011-12-21 20:24:49

标签: java model-view-controller events cohesion

对于业余爱好我正在制作游戏。游戏中有一个追逐人类的怪物(像吃豆子一样)。当吃豆子被卡住时,可以吃人或做一些动作;应该提出一个事件。这是因为我的程序变得不合适了,因为所有的对象都必须彼此了解内聚力不好。

有一个类似对象的控件(称为Game)应该响应事件;人类移动,怪物移动,人类吃掉,怪物卡住,并最终让视图知道发生了什么,所以它重新粉刷。同样重要的是,视图会响应演员的按键,并且这些事件应该以某种方式传达给人类(也包括事件)。

  1. 有人可以帮我解决这个问题吗?我在互联网上搜索同样的问题,但没有遇到过。

  2. 在MVC中:控制器是否知道视图?如果是这样:整个程序是从控制器开始还是从视图开始? (是谁)

2 个答案:

答案 0 :(得分:1)

基本上,事件处理机制只是一个生产者 - 消费者模式,假设您正在生成一些事件(一个动作),并且有一组需要通知您的动作的侦听器。

是否要使用Java内置事件处理取决于您已经编写了多少代码,如果重构您的代码以使用Java事件处理需要付出很多努力,并且您只有有限的一组事件,然后你可以编写自己的消息传递系统。但显然,应该优先使用Java事件处理机制,因为它需要注意通知所有为该事件注册的监听器,您不必担心通知每个监听器,以后它将帮助您进行调试,如果发生任何事情错误。我希望它能回答你的第一个问题

简而言之,您可以编写自己的事件,例如HumanMovedEvent,MonsterMovedEvent等。

关于你的第二个问题,在MVC中是的,控制器知道它需要触发任何特定操作的所有视图。控制器可以为任何特定操作选择任何特定视图,假设您执行某些操作A,则可以调用视图V.

并且您的程序开始于从UI向Controller发送请求。然后,Controller会选择为特定操作呈现所需的View。

我希望我明确表示:)

答案 1 :(得分:0)

在MVC中,控制器知道模型对象和视图。模型对象不知道谁在控制它,同样,视图也不知道。模型和视图通常通过回调与控制器通信:模型定义了各种回调方法的接口,并且具有一个“委托”实例变量,其中包含指向该接口的指针。控制器将自身设置为模型上的委托。同样对于观点。 您也可以按照建议使用事件,而不是回调,这会增加额外的解耦层:

  • 模型可以有多个事件监听器,而不仅仅是控制器
  • 如果控制器也使用事件与模型进行通信,那么控制器根本不需要了解模型,只需了解事件。

通常,您的程序中的每个对象都有一个模型 - 视图 - 控制器组合(一个怪物模型,怪物视图和怪物控制器)。但是您也可以让一个控制器管理多个模型对象和/或视图。这取决于您使用哪种方法最实用的UI框架。

您的第二个问题还取决于您使用的UI框架。通常,控制器实例化视图,但某些框架以不同方式执行。

对于您提到的键盘键:通常视图会通知控制器按下“ctrl-K”的键,控制器会将其转换为模型对象“向上移动1个”的命令。