杂七杂八——适用于WPF的设计模式

 杂七杂八——适用于WPF的设计模式
 
小序:
当梦想忽然有一天变成现实的时候,咱们会有什么样的感受?惊喜天然是少不了的。惊喜事后呢?剩下的就是要接受现实了——就像小鬼当家里的小家伙。
 
正文:
有朝一日能把软件的UI设计和逻辑设计分开,这是多年来程序开发人员的梦想。现在,这个梦想被XAML+C#实现了,你们都很开心。开心事后,问题来了——Binding与依赖属性再好使、路由事件和命令再灵活,若是不加约束地乱用和过分使用,同样会致使软件架构的不稳固以及招致维护、测试和调试方面的麻烦。
 
那么,怎样才能用好WPF带来的结构上的新特性呢?咱们须要作的,不是从头开始创造一个新模式,而是须要把WPF的新特性揉合进现有的、成熟的开发框架中去。下面,让咱们开始WPF开发框架的演进之旅!
 
MVC时代
现有的开发框架林林总总,但万变不离其宗,这个“宗”指的就是最为经典的MVC模式。插一句,有一次面试一位候选人,当我问及这个模式的时候,这位兄台干脆地回答到:“MCV!”,因而我就让他“展开”讲讲了:p
 
MVC框架出现的年代比较早,生成软件UI和逻辑用的是同一种语言(好比C++/Java/Delphi),灵活性基本上是局限在对于同一块数据(由Model暴露出来)使用不一样的视图(View,也就是UI)展示给用户。
 
MVP时代
随着互联网的发展,程序再也不是一个个只能跑在特定操做系统上的代码块,成千上万的用户但愿使用相同的程序共享相同的数据。操做系统平台一时半会是统一不起来了,A厂商程序跨到B厂商平台上的那只脚也每每被B厂商穿上一只小鞋。万般无奈下,开发人员只好诉诸于全部操做系统平台的交集——浏览器——赶鸭子上驾般地作起了程序的宿主;HTML也没被放过,原本用于简单呈现页面的标签语言却被CSS、JavaScript、XML等等武装到了牙齿。
 
Anyway,程序能够跑在浏览器里了,须要开发人员从新把程序开发一遍吗?人们发现,不管程序的前端(UI部分)跑在哪里,它的后台逻辑是不会改变的。因而人们开始想:我怎样才能把UI和逻辑解耦并对逻辑层加以复用呢?必须要在设计或者重构的时候考虑上这一点才能够。
 
因而,在MVC的基础上,人们向前推动了一步——MVP模式诞生了(有玩儿文字游戏的嫌疑哦!)。Interface这个词被译成“接口”以后就丢了些本来的意思。若是还把当译成“界面”,那么这个意思就能找回来了——现实世界也是这样,当物体受到接力的时候,凡有界面的地方就是最容易被撕下来的地方。所以,interface这个词在译成中文时,“接口”传达的是其能够做为公共约束(契约)的一层意思;“界面”则能传达解耦的一层意思。
 
在MVP模式中,为了让UI层可以从逻辑层上“撕”下来,设计师们在UI层与逻辑层之间加了一层interface。不管是UI开发人员仍是数据开发人员,都要尊重这个契约、按照它进行设计和开发。这样,理想状态下不管是Web UI仍是Window UI就均可以使用同一套数据逻辑了。
 
MVVM时代
如今,WPF来了,它带来了3D、动画、音频视频……这致使了UI的变化将更加细节化、可定制化。同时,在技术层面,WPF也带来了诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。咱们怎样才能立足于原有MVP框架、把WPF的新特性揉合进去,以应对客户复杂的需求呢?
 
图说MVP与MVVM
 
MVC模式大都已经很是熟悉了,咱就不说了。让咱们看看它的升级版——MVP
 
 
 
从这张图上咱们能够看出以下几点:
1. IView这个interface层帮助咱们把各种UI与逻辑层解耦
2. IView这层同时也为自动化测试提供了入口(从UI层进入自动化测试,太麻烦了)
3. 传统的、由WinForm/Web Form/MFC等编写的UI是经过事件(本质是Windows 消息)与IView层沟通的。
4. WPF与IView层的沟通,最佳的手段是使用Binding,固然,也可使用事件
5. Presenter层要实现IView,多态机制能够保证运行时UI层显示恰当的数据。好比Binding,在程序中,你可能看到Binding的Source是某个interface类型的变量——实际上,这个interface变量引用着的对象才是真正的数据源
6. 无关紧要的Control……有的话,就当是留个记念吧,原版的MVP图里是没有Control的,Control被Presenter取代
7. 这里的Presenter有点歧义之虞,就我我的而言,感受Presenter是UI里的东西。
 
咱们再来看MVVM
 
一样有几点注意:
1. 当咱们只关注MVP模式与WPF结合的应用方式时,MVP就变成了MVVM。
2. 借鉴MVP的IView层,养成习惯。原版MVVM图里是没有这层的,但我会在程序里加上这层。
3. View Model听起来比Presenter要贴切得多
4. 我会把一些跟事件、命令相关的东西放在Controler里
 
 
就这些了~~没什么新鲜玩艺儿。
相关文章
相关标签/搜索