随着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 {
    protected abstract void DoWork();
    public Execute() {
       ... do some actions common to all commands ...
       DoWork();
   }
}
总而言之,silverlight在使用中经常会出现异步调用的情况,而面对复杂的异步调用,命令模式可以
说是一个很好的方法:
1. 减轻了开发量
2. 使得程序的结构更加合理。
3. 在与服务器端例如MOSS通信时有了更加清晰的UI以及更高的开发效率。
posted on 2009-02-12 02:29  Marshall628  阅读(687)  评论(1编辑  收藏  举报