浅谈WPF设计模式

2009-01-20 02:30黄建岗
中小企业管理与科技·上旬刊 2009年10期

黄建岗

摘要:本文主要介绍了软件UI设计和逻辑设计中的架构模式的发展过程,以及作为微软新一代客户端软件WPF,选择适合的设计模式来架构开发模型,更容易的实现应用UI的构建。

关键词:WPF WVC WVP WVVM UI

0引言

在把软件的Ul设计和逻辑设计分开的开发模式中,以XAML+C#的WPF开发逐渐占据了重要的位置。但是,当Binding与依赖属性、路由事件和命令不加约束地乱用和过度使用,这种开发一样会导致软件架构的不稳固以及招致维护、测试和调试方面的麻烦。那么,怎样才能用好WPF带来的结构上的新特性呢?又如何选择其使用模式?

1MVC模式

MVC(ModaI View ControIer)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分商,从而使同一个程序可以使用不同的表现形式。

MVC是Xerox PARC在八十年代为编程语言SmaIltaIk—80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用Cold-Fusion和PHP的开发者的欢迎。MVC框架生成软件UI和逻辑用的是同一种语言(比如c++/Java/delphi)灵活性基本上是局限在对于同一块数据(Model爆露出来)使用不同的视图(View,也就是U1)展现给用户。

目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。

2MVP模式

MVP是从MVC模式演变而来,它们基本思想有相通之处:ControlIer/Presenter负责逻辑处理,Model提供数据,View负责显示。而MVP与MVC有着重大区别是:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的ControlIer)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从Model中直接读取数据而不是通过Controller。

随着互联网的发展,程序不仅仅是运行在特定操作系统上的代码块,网络用户希望使用相同的程序共享相同的数据。多种操作系统平台的不统一,造成各厂商程序的运行限制。为了实现程序共享数据,开发人员只好诉诸于所有操作系统平台的交集——浏览器。

程序跑到了浏览器里,不需要开发人员重新开发。因为人们发现,无论程序的前端(UI部分)跑在哪里,它的后台逻辑是不会改变的。于是我们会想怎样才能把UI和逻辑解耦并对逻辑层加以复用呢?必定需要在设计或者重构的时候考虑这一点才可以。

在MVP模式中,为了让UI层能够从逻辑层上分出来,设计师们在U1层与逻辑层之间加了一层interface。

由图1说明如下几点:①1View这个interface层帮助我们把各类UI与逻辑层解耦;②传统的、由winForm/Web Form/MFc等编写的UI是通过事件(本质是Windows消息)与IView层沟通的;③WPF与IVlew层的沟通,最佳的手段是使用Binding,当然,也可以使用事件;④Presenter层要实现IView,多态机制可以保证运行时UI层显示恰当的数据。比如Binding,在程序中,你可能看到Binding的Source是某个interface类型的变量——实际上,这个interface变量引用着的对象才是真正的数据源;⑤可有可无的Control,原版的MVP图里是没有ContoI的,Control被Presenter取代。

3MVVM模式

WPF带来了新的技术体验,如Sliverlight、音视频、3D、动画等,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了诸如Binding、Dependency Prope rty、Routed Events、Command、DataTempiate、ControlTempIate等新特性。我们怎样才能立足于原有MVP框架、把WPF的新特性揉合进去,以应对客户复杂的需求呢?

可以说MWM是专为WPF打造的模式,见图2所示。

View绑定到VjewModel,然后执行一些命令在向它请求一个动作。而反过来,ViewModel跟Model通讯,告诉它更新来响应UI。这样便使得为应用构建UI非常的容易。往一个应用程序上贴一个界面越容易,外观设计师就越容易使用BIend来创建一个漂亮的界面。同时,当UI和功能越来越松耦合的时候,功能的可测试性就越来越强。

无论是UI开发人员还是数据开发人员,都要尊重这个契约、按照它进行设计和开发。这样,理想状态下无论是Web UI还是WindOW UI就都可以使用同一套数据逻辑了。