Java 当输入事件仅影响视图时,有关控制器及其角色(如果有)的MVC设计帮助

Java 当输入事件仅影响视图时,有关控制器及其角色(如果有)的MVC设计帮助,java,model-view-controller,design-patterns,javafx,Java,Model View Controller,Design Patterns,Javafx,诚然,我对使用设计模式是一个新手,我似乎不确定如何在这里继续。我正在用JavaFX构建自定义图形符号。我只是扩展父对象,将矩形和圆添加到符号类中,然后在场景中显示该符号对象 该符号类还注册事件处理程序,如SetOnMouseEnter和其他许多事件处理程序,以根据鼠标事件更改符号。我想问的是,在哪里存储所有这些事件处理程序最有意义?我不确定它们是否应该进入控制器类,或者因为它们只影响该符号的视图,也许我应该将它们保留在符号的类中,只保留控制器用于必须从视图到模型进行通信的对象,反之亦然。感谢任何

诚然,我对使用设计模式是一个新手,我似乎不确定如何在这里继续。我正在用JavaFX构建自定义图形符号。我只是扩展父对象,将矩形和圆添加到符号类中,然后在场景中显示该符号对象


该符号类还注册事件处理程序,如SetOnMouseEnter和其他许多事件处理程序,以根据鼠标事件更改符号。我想问的是,在哪里存储所有这些事件处理程序最有意义?我不确定它们是否应该进入控制器类,或者因为它们只影响该符号的视图,也许我应该将它们保留在符号的类中,只保留控制器用于必须从视图到模型进行通信的对象,反之亦然。感谢任何人谁可以在这方面提供一些线索(或可以向我指出良好的资源)

因为您的意图是改变对象

我会这样理解:

模型:表示所显示数据的所有内容。在您的例子中,符号类包含所有圆

控制器:如果以任何方式修改模型(符号对象),则仅允许使用控制器类中的方法进行修改。控制器是您的层,只有通过该层您才能访问模型进行修改

视图:显示模型所需的任何内容都可以/应该放置在此零件中

所以这取决于你,你的程序是否会“记忆”当前选择,或者你的模型是否也有相应的变量。我认为这两种方法都应该有效

1.(在模型中):如果模型中有变量,则选择符号将是通过控制器类调用的操作(因为它会更改模型),并且因为模型会更改,它将触发视图类更新模型的视图。(视图使用观察者模式获取新模型数据并在模型更改时重新绘制)

2.(在使用视图和控制器的显示程序中):如果选择在此处“记忆”,我认为可能会产生一些混淆,因为视图不同(取决于选择)。因此,我建议走第一条路

请阅读关于OSR(一个单独的职责),我不知道如何将OSR与MVC结合起来,以及是否最好扩展您的“真实模型”以添加一个选择,因为这样可以使您的模型不受可能使用相同模型的其他类中可能不需要的编辑对象的影响。如果始终希望允许编辑符号类,则无需担心向模型中添加选择变量

所以,关于鼠标输入和单击的事件,请尽量严格:您总是通过程序本身处理用户输入,但如果这是一个可以理解为模型操纵的操作,那么您将在控制器中调用一个方法。您不必遵循这些MVC规则,但它应该可以帮助您更好地阅读项目,您可以添加多个视图,这些视图都会自动更新,扩展应该更容易

如果您不确定结构,典型的方法是尝试定义所有可能的解决方案,然后比较它们。尝试找到一种简单的方法(易于理解和扩展)。松耦合、OSR和DRY是很好的提示。足够普遍,尽可能多地尝试应用它们。 但也要记住,如果一个解决方案只是遵循设计模式,但它“感觉”太复杂了,那么还要考虑构建一个简单的类或其他方法。有时,我们构建的复杂性超出了需要。e、 g.Factory和Builder模式是很好的设计模式,但如果一个类需要非常复杂的配置,但不需要多个不同的构造,也不涉及其他对象,那么。。构造函数中包含代码的类可以使用更好的方法

作为一个很好的资源,我推荐来自Orealy的书籍“Head-First设计模式”和“Head-First面向对象分析与设计”。另外,出版商韦斯利的书也不错。通常你可以在你的大学图书馆找到它们免费借阅。 尝试找到设计模式的真正用途,这有助于理解它们(为什么有用),并让您获得一些使用经验。

一般建议

与其直接从抽象概念开始工作,我建议在现有代码中查看JavaFX中实现的这些模式的示例,并查看它们是如何编码的。当您找到一些喜欢的模式时,可以在代码中模拟它们

在大型编程中,您在整个应用程序或场景中应用MVC模式,而在小型编程中,您在特定控件类型中应用模式,两者之间存在差异。你的问题似乎更与后面的情况有关,所以我将主要考虑这个答案。


JavaFX控件-外观、行为和公共API

看看现有的。对于
按钮
,您将有:

  • -用于操纵控件的公共API
  • -控件的可视视图
  • -事件绑定(按键/鼠标事件等)
  • ButtonBehavior
    提供了一个抽象api,因此按钮可以绑定到不同的平台和用户特定的事件映射,以实现按键、鼠标和触摸组合

    ButtonSkin
    允许在不修改公共API或行为的情况下完全交换控件的可视化实现

    按钮
    公共API提供了一个稳定的API,按钮用户可以独立于控件实现的任何视觉或行为变化进行编程


    消除抽象

    虽然skin和behavior API非常适合抽象出行为和外观的实现细节,但它们确实增加了复杂性