各位大虾,本人在实际应用Command的模式进行编程的时候,有一些困惑,请教一下。
在对有工具条的窗体编码的时候,工具条上的按钮相应事件中调用某个实现ICommand接口的类的Execute方法。下面是一个NewUserCommand类的代码:
public class NewUserCommand : YLCommand
{
#region 变量
private FrmUsers _frmUsers = null;
#endregion #region 构造函数
public NewUserCommand(FrmUsers frmUsers)
{
_frmUsers = frmUsers;
}
#endregion #region YLCommand 成员
public void Execute()
{
_frmUsers.tbcMain.SelectedIndex = 1;
_frmUsers.txtWorkCode.Focus();
}
#endregion }
窗体工具条的按键处理事件中如下调用NewUserCommand类:
    YLCommand newUserCommand = new NewUserCommand(this);
    newUserCommand.Execute();
真如上面所示,带来的好处在于窗体中的代码量被分散在各个ICommand接口的实现类中,功能明确,代码简练。缺点是由于NewUserCommand类中直接引用了窗体本身。所以这些类与窗体本身的耦合度是非常高的,这样NewUserCommand类只能在当前窗体中使用,没有通用性。
    为了提高通用性,我想了一个方法,就是窗体中提供一些接口的实现,对于上列可以定义一个INew接口,窗体中实现该接口,而NewUserCommand类可以直接调用窗体的这个接口。但是这样做完全可以由工具条直接调用INew接口而不必通过NewUserCommand类了。
    在此,提出个问题:上述哪一种设计比较正确?还是不应该在这种环境下应用Command模式?

解决方案 »

  1.   


    其实我觉得ICommand接口实现类的通用性本来就只限于一个程序中的,比如工具栏的按钮和菜单项要实现相同功能的话就调用同一个ICommand接口的实现类。仅此而已。至于窗体是应该以实现接口为基础的
      

  2.   

    经过研究,发现采用ICommand的方式处理在工具条按钮的事件处理函数可以这样写,代码非常简练:
    private void tblToolbar_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
    {
    object[] arg = {this};
    YLCommand command = (YLCommand)System.Activator.CreateInstance(Type.GetType(e.Button.Tag.ToString()),arg);
    command.Execute();
    }