当前位置: 首页 > news >正文

浅谈MVP与Model-View-ViewModel(MVVM)设计模式

 微软的WPF带来了新的技术体验,如Sliverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性揉合进去,以应对客户日益复杂的需求变化。
 
      WPF的数据绑定与Presentation Model相集合是非常好的做法,使得开发人员可以将View和逻辑分离出来,但这种数据绑定技术非常简单实用,也是WPF所特有的,所以我们又称之为Model-View-ViewModel (MVVM)。这种模式跟经典的MVP(Model-View-Presenter)模式很相似,除了你需要一个为View量身定制的model,这个model就是ViewModel。ViewModel包含所有由UI特定的接口和属性,并由一个ViewModel 的视图的绑定属性,并可获得二者之间的松散耦合,所以需要在ViewModel 直接更新视图中编写相应代码。数据绑定系统还支持提供了标准化的方式传输到视图的验证错误的输入的验证。
 
如下图MVP设计模式架构所示。
                               
 

 
        在视图(View)部分,通常也就是一个Aspx页面。在以前设计模式中由于没有清晰的职责划分,UI 层经常成为逻辑层的全能代理,而后者实际上属于应用程序的其他层。MVP 里的M 其实和MVC里的M是一个,都是封装了核心数据、逻辑和功能的计算关系的模型,而V是视图(窗体),P就是封装了窗体中的所有操作、响应用户的输入输出、事件等,与MVC里的C差不多,区别是MVC是系统级架构的,MVP是用在某个特定页面上的,也就是说MVP的灵活性要远远大于MVC
,实现起来也极为简单。
 
 
      我们再从IView这个interface层来解析,它可以帮助我们把各类UI与逻辑层解耦,同时可以从UI层进入自动化测试自动化测试(Unit/Automatic Test)并提供了入口,在以前可以由WinForm/Web Form/MFC等编写的UI是通过事件Windows消息与IView层沟通的。WPF与IView层的沟通,最佳的手段是使用Binding,当然,也可以使用事件;Presenter层要实现IView,多态机制可以保证运行时UI层显示恰当的数据。比如Binding,在程序中,你可能看到Binding的Source是某个interface类型的变量,实际上,这个interface变量引用着的对象才是真正的数据源。
    
       MVC模式大家都已经非常熟悉了,在这里我就不赘述,这些模式也是依次进化而形成MVC—>MVP—>MVVM。有一句话说的好:当物体受到接力的时候,凡是有
界面的地方就是最容易被撕下来的地方。因此,IView作为公共视图接口约束(契约)的一层意思;View则能传达解耦的一层意思。
下面介绍一下MVVM设计模式。因为WPF技术出现,从而使MVP设计模式有所改进,MVVM 模式便是使用的是数据绑定基础架构。它们可以轻松构建UI的必要元素。
如,下图所示MVVM架构图。
                                
      可以参考 The Composite Application Guidance for WPF(prism),prism V2 下载源码
  
    View绑定到ViewModel,然后执行一些命令在向它请求一个动作。而反过来,ViewModel跟Model通讯,告诉它更新来响应UI。这样便使得为应用构建UI非常的容易。往一个应用程序上贴一个界面越容易,外观设计师就越容易使用Blend来创建一个漂亮的界面。同时,当UI和功能越来越松耦合的时候,功能的可测试性就越来越强。
     
 在MVP模式中,为了让UI层能够从逻辑层上分离下来,设计师们在UI层与逻辑层之间加了一层interface。无论是UI开发人员还是数据开发人员,都要尊重这个契约、按照它进行设计和开发。这样,理想状态下无论是Web UI还是Window UI就都可以使用同一套数据逻辑了。借鉴MVP的IView层,养成习惯。View Model听起来Presenter要贴切得多;会把一些跟事件、命令相关的东西放在Controler里。
   
   参考示例:PersonViewModel层
public  FamilyTreeViewModel(Person rootPerson)
{
    _rootPerson 
=   new  PersonViewModel(rootPerson);

    _firstGeneration 
=   new  ReadOnlyCollection < PersonViewModel > (
        
new  PersonViewModel[] 
        { 
            _rootPerson 
        });
    _searchCommand 
=   new  SearchFamilyTreeCommand( this );
}
 
 
 在这里我不在赘述, 详细应用实例参考:
Simplifying the WPF TreeView by Using the ViewModel Pattern
源码下载

相关文章:

  • Net 实现纳秒级别计算
  • WPF中的音频——(2)
  • WinCE读写ini文件和xml文件的方法
  • Linux GNOME桌面使用技巧大全
  • 转:WEB页上弹消息框总汇~!
  • 解决AJAX中使用UpdatePanel后再用Response.Write();等无法弹出对话框问题
  • 用于收发电子邮件的应用类
  • 在自己网站加百度搜索框这么简单
  • ubuntu下root 密码忘记的解决方法
  • 从“芯”认识内存
  • Using LINQ in ASP.NET (1)
  • 又开始了Vmware……
  • 安装完流媒体服务器WP9Server,后发现原iis默认80端口被占用:
  • 跟小段一起学Solaris(14)---FTP服务
  • LINUX网络服务 DHCP服务
  • C++类的相互关联
  • Codepen 每日精选(2018-3-25)
  • JAVA多线程机制解析-volatilesynchronized
  • Java知识点总结(JavaIO-打印流)
  • js写一个简单的选项卡
  • magento2项目上线注意事项
  • PAT A1050
  • ucore操作系统实验笔记 - 重新理解中断
  • Vim Clutch | 面向脚踏板编程……
  • Vue官网教程学习过程中值得记录的一些事情
  • Vue小说阅读器(仿追书神器)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 Docker 部署 Spring Boot项目
  • HanLP分词命名实体提取详解
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​TypeScript都不会用,也敢说会前端?
  • # include “ “ 和 # include < >两者的区别
  • #HarmonyOS:基础语法
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (8)STL算法之替换
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (day 12)JavaScript学习笔记(数组3)
  • (分布式缓存)Redis分片集群
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (万字长文)Spring的核心知识尽揽其中
  • (一)基于IDEA的JAVA基础12
  • ***测试-HTTP方法
  • *p++,*(p++),*++p,(*p)++区别?
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET建议使用的大小写命名原则
  • @KafkaListener注解详解(一)| 常用参数详解
  • [20180224]expdp query 写法问题.txt
  • [BZOJ5250][九省联考2018]秘密袭击(DP)