在开发图形界面应用程序的时候,会把管理用户界面的层次称为 View
,应用程序的数据为 Model
,Model
提供数据操作的接口,执行相应的业务逻辑。
MVC
MVC
除了把应用程序分为 View
、Model
层,还额外的加了一个 Controller
层,它的职责是进行 Model
和 View
之间的协作(路由、输入预处理等)的应由逻辑(application logic
)。
Model
进行处理业务逻辑。
用户对 View
操作以后,View
捕获到这个操作,会把处理的权利交移给Controller
(Pass calls
)。
Controller
会对来自 View
数据进行预处理、决定调用哪个 Model
的接口。
然后由 Model
执行相关的业务逻辑。
当Model
变更了以后,会通过观察者模式(Observer Pattern
)通知 View
。
View
通过观察者模式收到 Model
变更的消息以后,会向 Model
请求最新的数据,然后重新更新界面。
View -> Controller -> Modal -> View(观察者模式) -> Model
MVP
和 MVC
模式一样,用户对 View
的操作都会从 View
交易给 Presenter
。
Presenter
会执行相应的应用程序逻辑,并且会对 Model
进行相应的操作。
而这时候 Model
执行业务逻辑以后,也是通过观察者模式把自己变更的消息传递出去,但是是传给 Presenter
而不是 View
。
Presenter
获取到 Model
变更的消息以后,通过 View
提供的接口更新界面。
View -> Presenter -> Model -> Presenter -> View
MVVM
MVVM
可以看做是一种特殊的 MVP
(Passive View
)模式,或者说是对 MVP
模式的一种改良。
MVVM
代表的是 Model-View-ViewModel
,可以简单把 ViewModel
理解为页面上所显示内容的数据抽象,和 Domain Model
不一样,ViewModel
更适合用来描述 View
。 MVVM
的依赖关系和 MVP
依赖关系一致,只不过是把 P
换成了 VM
。
MVVM
的调用关系:
MVVM
的调用关系和 MVP 一样。
但是,在 ViewModel
当中会有一个叫 Binder
,或者是 Data-binding engine
的东西。
以前全部由 Presenter
负责的 View
和 Model
之间数据同步操作交由给 Binder
处理。
你只需要在View
的模板语法当中,指令式声明 View
上的显示的内容是和 Model
的哪一块数据绑定的。
当 ViewModel
对进行 Model
更新的时候,Binder
会自动把数据更新到 View
上,当用户对 View
进行操作(例如表单输入),Binder
也会自动把数据更新到 Model
上。
这种方式称为:Two-way data-binding
,双向数据绑定。
可以简单而不恰当地理解为一个模板引擎,但是会根据数据变更实时渲染。
ViewModel -> Model && binder -> View
View -> binder -> Model
Q.E.D.