寻找例如用于UI命令模式的[关闭](Looking for example of Command p

2019-08-17 03:34发布

我正在与包括工具栏按钮,菜单项和击键都启动相同的底层代码的基本UI一个WinForm .NET应用程序。 现在对于这些事件处理程序调用执行功能的常用方法。

从我读过这是什么类型的动作可以由处理命令设计模式与自动启用/禁用或选中/取消选中的UI元素的额外好处。

我一直在寻找的净一个很好的例子项目,但真的还没有找到一个。 有没有人有可共享的一个很好的例子?

Answer 1:

让我们先确保我们知道Command模式是什么:

命令模式封装的请求作为一个对象,并赋予它一个已知的公共接口。 命令模式确保每个对象接收其自己的命令,并提供发送器和接收器之间的去耦。 发送者是调用的操作的对象,并且接收器是接收该请求并作用于它的对象。

下面是一个例子。 有很多方法可以做到这一点,但我要带一个接口基地的做法使代码为你更多的测试。 我不知道你喜欢什么语言,但我在C#写的。

首先,创建一个描述命令的接口。

public interface ICommand
{
    void Execute();
}

其次,创建将执行命令interface命令对象。

public class CutCommand : ICommand
{
    public void Execute()
    {
        // Put code you like to execute when the CutCommand.Execute method is called.
    }
}

第三,我们需要设置我们的调用或发送对象。

public class TextOperations
{
    public void Invoke(ICommand command)
    {
        command.Execute();
    }
}

四,创建将使用调用/发送对象的客户对象。

public class Client
{
    static void Main()
    {
        TextOperations textOperations = new TextOperations();
        textOperation.Invoke(new CutCommand());
    }
}

我希望你可以把这个例子并投入使用了您正在使用的应用程序。 如果您想了解更多的澄清,只是让我知道。



Answer 2:

你在正确的轨道上。 基本上你将有表示文档的模型。 您将在CutCommand使用此模式。 您将要改变CutCommand的构造函数接受要剪切的信息。 然后每次,说剪切按钮被点击时,你调用一个新的CutCommand并传递参数的构造函数。 然后使用这些参数在上课的时候调用Execute方法。



Answer 3:

尝试开源,.NET编辑器一样的SharpDevelop或者记事本++ 。

有(自然)在命令模式的一些讨论http://c2.com/cgi/wiki?CommandPattern可能会有所帮助。



Answer 4:

Qt使用的菜单栏/工具栏项命令模式。

QActions从QMenuItem和在QToolBar seperately创建,并且操作可以被分配给QMenuItem和在QToolBar分别的setAction()和的addAction()方法。

http://web.archive.org/web/20100801023349/http://cartan.cas.suffolk.edu/oopdocbook/html/menus.html

http://web.archive.org/web/20100729211835/http://cartan.cas.suffolk.edu/oopdocbook/html/actions.html



Answer 5:

我不能帮你例如链接,但可以通过自己提供的例子。

1)定义ICommand接口:

public interface ICommand {
   void Do();
   void Undo();
}

2)做你的ICommand实现混凝土的命令,同时也定义抽象基类,它们:

public abstract class WinFormCommand : ICommand {

}

3)创建命令调用器:

public interface ICommandInvoker {
  void Invoke(ICommand command);
  void ReDo();
  void UnDo();
}

public interface ICommandDirector {
  void Enable(ICommand);
  void Disable(ICommand);
}

public class WinFormsCommandInvoker : ICommandInvoker, ICommandDirector {

    private readonly Dictionary<ICommand, bool> _commands;
    private readonly Queue<ICommand> _commandsQueue;       
    private readonly IButtonDirector _buttonDirector;

    // you can define additional queue for support of ReDo operation

    public WinFormsCommandInvoker(ICommandsBuilder builder, IButtonDirector buttonDirector) {
      _commands = builder.Build();
      _buttonDirector = buttonDirector;
      _commandsQueue = new Queue<ICommand>();
    } 

    public void Invoke(ICommand command) {
        command.Do();
        __commandsQueue.Enqueue(command);
    }

    public void ReDo() {
      //you can implement this using additional queue
    }

    public void UnDo() {
      var command = __commandsQueue.Dequeue();
      command.Undo();
    }

    public void Enable(ICommand command) {
      _commands.[command] = true;
      _buttonDirector.Enable(command);
    }

    public void Disable(ICommand command) {
      _commands.[command] = false;
      _buttonDirector.Disable(command); 
    }
}

4)现在,你可以实现你的ICommandsBuilder,IButtonDirector并添加其他接口如ICheckBoxDirector到WinFormsCommandInvoker。



文章来源: Looking for example of Command pattern for UI [closed]