我应该如何为文本编辑器应用程序实现模型 - 视图 - 控制器设计?

时间:2015-09-28 22:29:49

标签: user-interface model-view-controller jython

我正在开发一个类似于Jython中的Emacs的文本编辑器,尽管在这种情况下语言并不重要。

我有一个独立的数据模型,一些视图用于菜单,文本区域和我显示日志消息的控制台,并将接收来自用户的命令,每个视图都有一个控制器。此外,我有一个主控制器,它是应用程序的入口点,并将所有视图放在一起并创建视图控制器。

当用户与视图交互时,视图会调用其控制器,控制器会决定需要执行的操作。如果用户在菜单中选择显示关于弹出窗口的选项,则菜单控制器将自己处理该选项。但是,当菜单中有一个涉及另一个视图中的更改的选项时,例如,当用户选择关闭文件时,需要清除文本区域。在这种情况下,菜单控制器将动作委托给主控制器,主控制器反过来指出文本区域控制器需要告诉其视图以清除文本。类似的东西:

1. User clicks "close file" in menu view
2. Menu view tells menu controller user selected "close file"
3. Menu controller delegates this actions to the Main controller since it has no access to the text area view.
4. Main controller tells text area controller to clear up text area
5. Text area controller clears up its view's text area.

我发现用户正在与之交互的视图的直接控制器无法处理大多数用户操作,并且需要将其传递给主控制器,而主控制器是一个巨大的类,而其他控制器只是委派行动。

这看起来不是最好的方式。我错过了什么吗?有一个更好的方法吗?我应该忘记中间控制器并重新考虑主控制器吗?

对此的任何见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

你的设计很好。

你的MainController就像是J2EE设计中的FrontController(我的经验更多是Java)。前端控制器有责任将传入的请求委托给适当的应用程序控制器(J2EE设计用语),其中一个例子在您的设计中是TextArea Controller。

要全面了解FrontController和ApplicationController如何协同工作,请参阅此页面上的模式图http://corej2eepatterns.com/index.htm

此外,您可以在http://www.oracle.com/technetwork/java/frontcontroller-135648.html的FrontController和http://corej2eepatterns.com/ApplicationController.htm的应用控制器上详细阅读

基本的理解是FrontController就像“主路由控制器”或应用程序的元控制器,它将传入的请求路由到适当的应用程序控制器。