当前位置:首页 > Web开发 > 正文

View可以进行组件化

2024-07-17 Web开发

做客户端开发、前端开发对MVC、MVP、MVVM这些名词不了解也应该大抵听过,都是为了解决图形界面应用措施庞大性打点问题而孕育产生的应用架构模式。网上很多文章关于这方面的讨论对照杂乱,各类MV模式之间的区别分不清,甚至有些描述都是错误的。本文追根溯源,从最经典的Smalltalk-80 MVC模式开始逐步还原图形界面之下最真实的MV模式。

GUI措施所面临的问题

图形界面的应用措施供给给用户可视化的操纵界面,这个界面供给给数据和信息。用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application logic)可能会触发必然的业务逻辑(business logic)对应用措施数据的变换,数据的变换自然需要用户界面的同步变换以供给最准确的信息。例如用户对一个电子表格从头排序的操纵,应用措施需要响应用户操纵,对数据进行排序,然后需要同步到界面上。

在开发应用措施的时候,以求更好的打点应用措施的庞大性,基于职责疏散(Speration of Duties)的思想城市对应用措施进行分层。在开发图形界面应用措施的时候,会把打点用户界面的条理称为View,应用措施的数据为Model(注意这里的Model指的是Domain Model,这个应用措施对需要解决的问题的数据抽象,不包罗应用的状态,可以简单理解为东西)。Model供给数据操纵的接口,执行相应的业务逻辑。

有了View和Model的分层,那么问题就来了:View如何同步Model的变换,View和Model之间如何粘合在一起。

带着这个问题开始探索MV模式,会发明这些模式之间的差异可以归纳为对这个问题措置惩罚惩罚的方法的差别。而几乎所有的MV模式都是经典的Smalltalk-80 MVC的改削版。

Smalltalk-80 MVC 历史配景

早在上个世纪70年代,美国的施乐公司(Xerox)的工程师研发了Smalltalk编程语言,并且开始用它编写图形界面的应用措施。而在Smalltalk-80这个版本的时候,一位叫Trygve Reenskaug的工程师设计了MVC图形应用措施的架构模式,极大地降低了图形应用措施的打点难度。而在四人帮(GoF)的设计模式傍边并没有把MVC当做是设计模式,而仅仅是把它当作解决问题的一些类的调集。Smalltalk-80 MVC和GoF描述的MVC是最经典的MVC模式。

MVC的依赖关系

MVC出了把应用措施分成View、Model层,还特别的加了一个Controller层,它的职责为进行Model和View之间的协作(路由、输入预措置惩罚惩罚等)的应用逻辑(application logic);Model进行措置惩罚惩罚业务逻辑。Model、View、Controller三个条理的依赖关系如下:

Controller和View都依赖Model层,Controller和View可以互相依赖。在一些网上的资料Controller和View之间的依赖关系可能不一样,有些是单向依赖,有些是双向依赖,这个其实关系不大,后面会看到它们的依赖关系都是为了把措置惩罚惩罚用户行为触发的事件措置惩罚惩罚权交给Controller。

MVC的挪用关系

用户的对View操纵以后,View捕获到这个操纵,会把措置惩罚惩罚的权利交移给Controller(Pass calls);Controller会对来自View数据进行预措置惩罚惩罚、决定挪用哪个Model的接口;然后由Model执行相关的业务逻辑;当Model变换了以后,会通过不雅察看者模式(Observer Pattern)通知View;View通过不雅察看者模式收到Model变换的动静以后,会向Model请求最新的数据,然后从头更新界面。如下图:

看似没有什么特另外处所,但是由几个需要出格存眷的关键点:

View是把控制权交移给Controller,Controller执行应用措施相关的应用逻辑(对来自View数据进行预措置惩罚惩罚、决定挪用哪个Model的接口等等)。

Controller操纵Model,Model执行业务逻辑对数据进行措置惩罚惩罚。但不会直接操纵View,可以说它是对View无知的。

View和Model的同步动静是通过不雅察看者模式进行,而同步操纵是由View本身请求Model的数据然后对视图进行更新。

需要出格注意的是MVC模式的精髓在于第三点:Model的更新是通过不雅察看者模式奉告View的,具体表示形式可以是Pub/Sub或者是触发Events。而网上很多对付MVC的描述都没有强调这一点。通过不雅察看者模式的好处就是:差此外MVC三角关系可能会有配合的Model,一个MVC三角中的Controller操纵了Model以后,两个MVC三角的View城市接受到通知,然后更新本身。连结了依赖同一块Model的差别View显示数据的实时性和准确性。我们每天都在用的不雅察看者模式,在几十年前就已经被大神们整合到MVC的架构傍边。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/27390.html