随着silverlight应用程序的普及,其设计模式也成了人们常常谈论的话题。事实上,当将silverlight与设计模式相结合的时候,其产生的能量将是巨大的。
下面介绍一下silverlight与设计模式中的command pattern的结合
command pattern的定义是利用命令对象来对action(行动)和parameter(参数)进行封装。举一个简单的例子,在word 2007中的保存按钮就是应用的命令模式。如图所示,
如果保存一个word文档,可以点击大按钮然后点保存选项,以或者是点击保存图标,亦或者是点击在toolbar上的保存选项。。。所有行为都是保存,但是命令的位置不同。。。这就是每一个命令对象对行动进行了封装,其最大的好处就在于其易于复用,并且可以降低耦合。
那么这种设计模式如何与silverlight进行结合呢,我们先看一下用silverlight进行http异步调用的实例
public class MyPanel:StackPanel { ... other functions ... void SubmitButton_Click(Object sender,EventArgs e) { ... collect data from forms ... ServerWrapper.DoSubmission(formData,SubmissionCallback); } void SubmissionCallback(SubmissionResult result) { ... update user interface ... } } |
我们可以看到,在没有结合command patter前,用silverlight进行异步调用的确显得很简单,可问题在于如果应用程序再敷在一些即有多个异步调用的话,我们将就需要添加一些按钮,而问题也就在于我们不能确定哪个调用属于哪个按钮,即行为与UI不能产生有效的映射关系。这时候我们便需要在我们在silverlight中添加命令模式,首先创建一个命令对象的接口:
public interface ICommand { void Execute(); } |
然后,我们可以设定命令的属性与参数,例如提交表单这个命令的一些属性:
public class SubmitFormCommand:ICommand { private FormData Data; public SubmitFormCommand(FormData data) { Data=data; } public void Execute() { ... processing ... ServerWrapper.DoSubmission(Data,Callback); } public void Callback(SubmissionResult result) { ... update user interface ... } } |
最后我们在silverlight中的page.xaml.cs中对提交按钮进行处理:
void SubmitButton_Click(Object sender,EventArgs e) { ... collect data from forms ... ICommand action=new SubmitFormCommand(formData); action.Execute() } |
命令模式还可以在对按钮进行更新时只做出最小的改动,在这里我们定义一个异步命令类,
如果我们想更新这个命令的话,我们只需要修改其中的子类就可以了
(注意抽象类的作用)
public class AsyncCommand:ICommand { |
总而言之,silverlight在使用中经常会出现异步调用的情况,而面对复杂的异步调用,命令模式可以
说是一个很好的方法:
1. 减轻了开发量
2. 使得程序的结构更加合理。
3. 在与服务器端例如MOSS通信时有了更加清晰的UI以及更高的开发效率。