Model–view–viewmodel(wiki翻译)[通俗易懂]

Model–view–viewmodel(wiki翻译)

大家好,又见面了,我是你们的朋友全栈君。

(本文译自wiki百科Model–view–viewmodel词条,转载此文请注明原文和本文链接)

Model–view–viewmodel(MVVM) 是一个软件架构设计模式。

MVVM 是 Martin Fowler 的 Presentation Model 设计模式的一个演变。和 Fowler 的 Presentation Model 一样,MVVM 抽象了 view 的状态和行为。但是,和 Presentation Model 抽象一个 view 不依赖于一个特定的UI平台的做法相反,MVVM是由微软WPF 和 Silverlight 的架构师Ken Cooper 和 Ted Peters开发,是一种简化用户界面的事件驱动编程方式。

由John Gossman(同样也是WPF和Silverlight的架构师)与2005年在他的博客上发表。

MVVM 和 Presentation Model 都源自于 model–view–controller 模式(MVC)。MVVM 促进了 GUI 开发与业务逻辑或者后端逻辑的分离,MVVM 中的 viewmodel 是一个转值器(value converter);这意味着 viewmodel 负责暴露(转换)model 中的数据对象来让对象变得更容易管理和使用。从这方面来说,viewmodel 更像一个 model 而不是 view,并且处理了大多数 view 的显示逻辑。viewmodel 也可以实现一个中介者模式来组织访问围绕 view 支持下用例集的后端逻辑。

Model–view–viewmodel 也被称为 model–view–binder,尤其运用但不仅仅在 .NET 平台。ZK(一个 java 的 web 应用框架) 和KnockoutJS (一个JS库)便用到了model–view–binder.

MVVM模式的组成 Model Model 是指任何一个领域模型(domain model),它代表了真实情况的内容(一个面向对象的方法),或表示内容(以数据为中心的方法)的数据访问层。

View 就像在 MVC 和 MVP 模式下,view 就是用户界面(UI)。

Viewmodel ViewModel 是一个公开公共属性和命令的抽象的view。取代了 MVC 模式的 controller,或 MVP 模式的任命者(presenter),MVVM 有一个驱动。在 viewmodel 中,这种驱动传达视图和数据绑定的通信。此 viewmodel 已被描述为该 model 中的数据的状态。

Binder机制 MVVM 模式中包含了说明性数据和命令绑定机制。微软的做法中,binder是一种叫 XAML 的标记语言。binder 使得开发人员不需要去编写样板化的代码来同步视图模型和视图。如果在微软解决方案库外执行实施成功了,那么这种数据绑定机制就是促成这个模式得以发展的关键性因素。

基本原理 MVVM 设计中充分利用了 WPF 中数据绑定功能,通过从 view 层消除几乎所有的 GUI 代码(“代码后置”),以更好地促进将视图层从其它模式中分离出来开发。开发人员不再需要具有用户体验才能来编写GUI代码,他们可以用由应用开发人员开发和维护的框架中的标记语言(如 XAML),来创建数据和 viewmodel 绑定。这种角色的分离使得UX设计师专注于UX的需求而不是编程的逻辑。因此应用程序层可在多个工作流开发以提高生产率。即使代码库只有一个开发人员,对 view 和 model 的适当分离都会更有效率,因为用户界面通常变化频繁,而且在开发周期期间,终端用户的反馈时间也会比较迟。

MVVM模式视图在MVC中提供的分离功能开发的优点的基础上,同时利用数据绑定的优点和绑定数据的框架,以求达到一种尽可能接近的纯应用程序模型。它使用了 binder,viewmodel 和任何业务层“数据检查”功能来验证输入的数据。其结果是,model 和框架驱动尽可能多的操作以消除或减少其直接操纵view的应用逻辑(例如,代码后置)。

批评 对 MVVM 模式的批评是来自 MVVM 创建者 John Gossman,他指出,对于简单的用户界面操作,执行 MVVM 的花费“ 过头了”。他还指出,对于较大的应用,推广 viewmodel 变得更加困难。此外,他还说明大型应用项目里数据绑定可以引起相当大的内存消耗。

转载于:https://juejin.im/post/5b28c5346fb9a00e67149400

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107463.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat15 密钥自动激活吗_在线激活

    (navicat15 密钥自动激活吗)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    189
  • phpstorm激活码永久[最新免费获取]2022.02.11「建议收藏」

    (phpstorm激活码永久)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html4K…

    2022年4月1日
    532
  • golang 面试题(从基础到高级)

    golang 面试题(从基础到高级)Golang面试问题汇总通常我们去面试肯定会有些不错的Golang的面试题目的,所以总结下,让其他Golang开发者也可以查看到,同时也用来检测自己的能力和提醒自己的不足之处,欢迎大家补充和提交新的面试题目.Golang面试问题汇总:1.Golang中除了加Mutex锁以外还有哪些方式安全读写共享变量?Golang中Goroutine可以通过Channel进行安全读写…

    2022年6月15日
    51
  • linux中ssh免密登录,Linux之SSH免密登录

    Linux双向SSH免密登录原理双向,顾名思义,双方互通,此处的意思是多台linux两两免密登录.双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他所有…【Linux】ssh免密登录一.ssh免密配置ssh无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以Cent…

    2022年4月14日
    42
  • toArray()方法使用说明「建议收藏」

    toArray()方法使用说明「建议收藏」ArrayList提供了一个将List转为数组的一个非常方便的方法toArray。toArray有两个重载的方法:1.list.toArray();2.list.toArray(T[] a);对于第一个重载方法,是将list直接转为Object[]数组;第二种方法是将list转化为你所需要类型的数组,当然我们用的时候会转化为与list内容相同的类型。

    2022年5月15日
    54
  • 虚拟机CentOS系统没有UNIX2dos或dos2UNIX命令的解决方案(参考各路大佬后的总结)

    虚拟机CentOS系统没有UNIX2dos或dos2UNIX命令的解决方案(参考各路大佬后的总结)首先申明一下,只是本人在该问题上遇到的弯路,再通过查看各路大佬的方法总结出来的解决方法:因为是看到了这篇文章https://blog.csdn.net/w616589292/article/details/38274475,然后我就走上了我的弯路了,下载了hd2u-1.0.0.tgz还有popt-1.8-1.x86_64.rpm 配置好了一切发现没有一点卵用。然后我又看见了这篇文章http:/…

    2022年5月18日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号