// update 1:因此,不幸的是,关于此主题的活动并不多于我所希望的-更底层

首先:我知道这个话题经常被超越,因此会受到个人意见的困扰,因此经常会因为偏离话题而封闭。因此,我将尽量保持客观。我希望这可以防止我被“锁定”。

当您查看Wikipedia时,它基本上是这样说的:用户直接与控制器交互,控制器操纵模型,模型更新视图。
在Google上搜索时,会发现许多其他类型:


例如,一个指出该模型始终是独立的,对其他模型一无所知
另一个人说控制器有点像胶水,但模型和视图彼此不认识


这几乎是这三个的任何组合以及一些“额外”的补充。因此,正如我所看到的:似乎并没有真正(正确的)方法来实现MVC,而是一些不同的方法都遵循相同的基本原理。

因此,我想尝试使其保持“客观”的方式:是否存在某些特定原因采用一种方法或另一种方法?将三者之一用作其他者的胶水有什么好处吗?还是所有人都以某种方式彼此了解?

当使用Swing时,已经使用某种形式的MVC-一些称为“ model-(ui)delegate”的来源,其中View和Controller由模型组合在一起。是否值得尝试像已经使用Swing一样重现这种样式?

也许可以点亮一下:
我目前想为Mixer开发一个API客户端(是的,我有关于YouTube和Twitch的主题,但是目前Mixer似乎是最适合我和我的需求的平台),并且在如何处理数据分离(模型)方面有些挣扎,GUI(视图)以及两者之间的所有粘合(控制器?)。过去,当我编写一些小型工具时,没有什么比所谓的意大利面条代码更好。但是,由于我想发布它(我已经开始使用公共GitHub存储库开始)或提供它作为服务(以便其他人在我的项目上使用我的客户端),因此我想按照一些既定的原则来构建它。

因此,我不是寻求个人意见(在这里似乎不喜欢这种观点),而是要求提供一些客观信息,以了解在Java中实际实现MVC的利弊的具体方式。

在此先感谢并向任何主持人致歉,现在主持人可能会认为“不是其中的一个”。

// edit 1:因此,尽管在过去的几周中没有太多关于此主题的活动,但我没有做任何事情,只是做了一些“重新搜索”:
从我的发现中我得到了:无论是只处理一些基于本地GUI的应用程序,还是我计划通过网络规划不同类型的视图和事件源的方法,都可以归结为以下几个类的互连:分离关注点,所有操作仅是一项特定的任务。
我发现了一些示例,其中View仅被视为GUI,其他示例也将其扩展到控制台甚至打印机。因此,将视图视为唯一的输入源可能不是最好的主意,而是将其视为仅显示数据的东西。另一侧的控制器输入也可以实现为GUI,甚至可以与显示数据的View结合使用,但应该至少是模块化的,以便可以与其他类型互换。

我想尝试实现它的方式是事件驱动的,以便根据触发事件的时间(发生事件的方式,然后触发事件的方式)发生“动作”,这是另一个话题。我已经看到许多使用Observer模式的示例-基本上是Observer和MVC的混合(至少据我所知)。这可能是实现它的一种可能方式:


一些输入来生成与输入控制器耦合的输入事件(可能是GUI,可能是控制台,可能是网络输入)
一个模型包含数据和修改它们的逻辑,也可能有自己的模型控制器
该视图仅由主应用程序或其自身的视图控制器操作,而不是将其自身注册为模型上的观察者
整体应用程序控制器,作为具有其他粘合逻辑的其他控制器之间的粘合物


通过该计划,基本应用程序启动将如下所示:main()首先创建主应用程序控制器,其中所有其他应用程序的列表都为空,然后,模型(或模型所包含的模型控制器)将模型链接起来。将控制器与主控制器模型化,最后将视图与主控制器链接起来。最后,在完成所有这些操作之后,将调用主控制器上的一些“入口点”以将其全部启动。

有人对此想法有意见吗?

最佳答案

我在大多数项目中都遵循一种模式,这种模式受Spring Boot MVC,SOA和许多UI框架(如JSF)的启发。

1-您的视图(如果有的话)始终是愚蠢的组件,它们从格式化的控制器中获取数据并准备好显示,但它们并不保持状态。

2-控制器或视图模型,应以适合视图的方式向视图提供所需的数据并维护其状态,但不执行服务的实际工作,它只是以适合于视图的方式格式化数据意见。控制器可以通过服务从模型获取此状态或数据。

3-模型层负责可能来自数据存储区(如数据库)的域对象的状态,一旦它们以适合服务的方式获取数据或对其应用CRUD操作,它们的作用就完成了,模型不对控制器或视图一无所知,模型根本不在乎它们是否完全没有视图。

4-一种不错的方法是在需要时将核心业务逻辑封装在服务中。服务包含核心业务逻辑,您可以遵循SOA原则来设计良好的服务以及诸如SOLID,DRY和某些设计模式之类的设计原则。服务应始终干净且设计良好,这样应用程序就不会因更改而失败,它们可以完成所有工作并提供适合任何UI的结果,而不仅仅是特定的控制器或UI,这就是您应该遵循SOA原理的原因。

那么,模型和视图模型/控制器之间有什么区别?视图模型提供了视图所需的信息... see this answer, for more clear explanation

对于API部分,要确保其干净和可重复使用,请遵循与您要使用的内容相关的设计原则,例如,如果要使用REST,则有conventions and best practices可以确保您的API干净且设计合理。

简而言之,请考虑每个层和类的单一职责。首先要构建模型和服务,对于大多数修改,应将其关闭。就像使用API​​一样开始使用它们,因此请构建控制器以使用它们。

您需要做很多事情来避免意大利面条代码的反模式。如果您想获得足够的资源来学习这一点,则可以从头开始的设计模式书和/或refactoring.guru或您喜欢的其他任何资料中阅读简洁的代码,简洁的体系结构书籍以及一些设计模式和重构技术。这个话题如此广泛,有很多事情要说。

关于java - Java中实现模型- View - Controller 的不同风格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61034504/

10-11 22:53
查看更多