谈谈你对MVC的理解

MVC 模式

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑在数据变化时更新控制器
  • View(视图) - 视图代表模型包含的数据的可视化
  • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

    Controller层用来调度View层和Model层,将用户界面和业务逻辑合理的组织在一起,起粘合剂的效果。所以Controller中的内容能少则少,这样才能提供最大的灵活性。controller相当于路由的作用。

 

实现

我们将创建一个作为模型的 Student 对象。StudentView 是一个把学生详细信息输出到控制台的视图类,StudentController 是负责存储数据到 Student 对象中的控制器类,并相应地更新视图 StudentView

MVCPatternDemo,我们的演示类使用 StudentController 来演示 MVC 模式的用法。

MVC 模式的 UML 图

 

MVC 是软件工程里面一个常用的概念。通常来讲,C 主要是指请求 url 的路由规则,即把请求打到对应的控制器。控制器调用模型实现业务逻辑和底层数据的获取,这一步骤一般在代码里会抽象出多个层次,比如 service,model,handler,controller 等等,看开发者的个人喜好,统称为 Model 层。最后交给渲染器渲染成 html 这样的客户端直接可用的格式,返回给客户端,这一步骤一般叫视图层。不过 MVC 在 web 开发里面已经有点昨日黄花的意味。现在讲究服务化,REST等等,前后端进一步分离,出现专门写逻辑的前端和 MVVM 模式,View 层在后端可以说已经用不到了当然你也可以把生成的 json 理解成 View 层。MVC 模式里面容易让人误解的就是 Model 层,其实 model 层不仅包含了从数据库获取数据,还包含了与请求相关的各种业务逻辑,可以说 model 层包含了你 90% 以上的代码。

在代码中,前后端分离项目,大多就是controller-service-dao三层架构,三层架构和mvc并不是两个对立的东西,service层与dao层是对model的进一步解耦而形成的分层,而controller(web)层本来就不该含有业务逻辑

(我以前以为model是数据,controller是逻辑,这是错的)

很多程序员偏爱于将业务逻辑放在Controller中,我极力反对这种做法。

我们知道在写程序时,业务逻辑的重复使用是经常要面对的场景。 如果业务逻辑写在控制器中, 要重用它的唯一方法就是将它提升到父类之中,通过继承来达到代码复用的效果。但这么做会带来一个巨大的副作用,违背了一项重要的面向对象设计原则:接口隔离。(?)

各Model之间是可以相互调用的, Controller也可以无障碍的调用Model,因此将业务逻辑放在Model中可以灵活的使用组合的方式复用代码。

而Controller之间是不可以相互调用的,要复用代码只能将代码提升至父类,通过继承实现,显然这种做法既不正确,也不灵活,因此完全不提倡。

为什么23种设计模式里面没有MVC?

MVC的是为了把数据(Model)和视图(View)分离开来,然后用控制器(Controller)来粘合M和V之间的关系。

MVC是複合模式,結合了觀察者模式,策略模式和組合模式。--《Head First設計模式

 


 


 

然我們利用我們學過的模式技術來重新看待一下MVC吧

 


 


 


 


 

沒錯,MVC裏面就運用了我們之前學過的策略模式,組合模式和觀察者模式

 总结

模型使用观察者模式,以便观察者更新,同时保持两者之间的解耦。

控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。

视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板、框架和按钮。

 


GoF (Gang of Four,四人组, 《Design Patterns: Elements of Reusable Object-Oriented Software》/《设计模式》一书的作者:Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)并没有把MVC提及为一种设计模式,而是把它当做“一组用于构建用户界面的类集合”。在他们看来,它其实是其它三个经典的设计模式的演变:观察者模式(Observer)(Pub/Sub), 策略模式(Strategy)和组合模式(Composite)。根据MVC在框架中的实现不同可能还会用到工厂模式(Factory)和装饰器(Decorator)模式。我在另一本免费的书“JavaScript Design Patterns For Beginners”中讲述了这些模式,如果你有兴趣可以阅读更多信息。

正如我们所讨论的,models表示应用的数据,而views处理屏幕上展现给用户的内容。为此,MVC在核心通讯上基于推送/订阅模型(惊讶的是 在很多关于MVC的文章中并没有提及到)。当一个model变化时它对应用其它模块发出更新通知(“publishes”),订阅者 (subscriber)——通常是一个Controller,然后更新对应的view。观察者——这种自然的观察关系促进了多个view关联到同一个 model。

对于感兴趣的开发人员想更多的了解解耦性的MVC(根据不同的实现),这种模式的目标之一就是在一个主题和它的观察者之间建立一对多的关系。当这个 主题改变的时候,它的观察者也会得到更新。Views和controllers的关系稍微有点不同。Controllers帮助views对不同用户的输 入做不同的响应,是一个非常好的策略模式列子。

嗯嗯,知道为什么MVC没有被GOF当作【一种】模式来对待了吧?

 

 

View层,单独实现了组合模式

Model层和View层,实现了观察者模式

View层和Controller层,实现了策咯模式

 

 

链接:

https://www.smwenku.com/a/5b8e80592b7177188345a942/

https://zhuanlan.zhihu.com/p/35680070

https://www.zhihu.com/question/27897315/answer/491119336

http://www.runoob.com/design-pattern/mvc-pattern.html

posted @ 2018-12-26 11:02  twoheads  阅读(4790)  评论(0编辑  收藏  举报