Ищем пример шаблона Command для пользовательского интерфейса [закрыто]

Я работаю над приложением WinForm .Net с базовым пользовательским интерфейсом, который включает кнопки панели инструментов, пункты меню и нажатия клавиш, которые все инициируют один и тот же базовый код. Прямо сейчас обработчики событий для каждого из них вызывают общий метод для выполнения функции.

Из того, что я читал, этот тип действия может быть обработан шаблоном проектирования Command с дополнительным преимуществом автоматического включения / отключения или проверки / снятия отметки с элементов пользовательского интерфейса.

Я искал в сети хороший пример проекта, но на самом деле не нашел. У кого-нибудь есть хороший пример, которым можно поделиться?

18.08.2008 18:31:08
5 ОТВЕТОВ
РЕШЕНИЕ

Давайте сначала удостоверимся, что мы знаем, что такое шаблон Command:

Шаблон команды инкапсулирует запрос как объект и дает ему известный общедоступный интерфейс. Шаблон команд гарантирует, что каждый объект получает свои собственные команды и обеспечивает разделение между отправителем и получателем. Отправитель - это объект, который вызывает операцию, а получатель - это объект, который получает запрос и воздействует на него.

Вот пример для вас. Есть много способов сделать это, но я собираюсь использовать подход на основе интерфейса, чтобы сделать код более тестируемым для вас. Я не уверен, какой язык вы предпочитаете, но я пишу это на C #.

Сначала создайте интерфейс, который описывает команду.

public interface ICommand
{
    void Execute();
}

Во-вторых, создайте объекты команд, которые будут реализовывать интерфейс команд.

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

В-третьих, нам нужно настроить наш объект invoker или sender.

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

В-четвертых, создайте объект client, который будет использовать объект invoker / sender.

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

Я надеюсь, что вы можете взять этот пример и использовать его для приложения, над которым вы работаете. Если вы хотите больше разъяснений, просто дайте мне знать.

20
18.08.2008 20:51:49

Попробуйте редакторы .NET с открытым исходным кодом, такие как SharpDevelop или Notepad ++ .

Есть (естественно) некоторое обсуждение шаблона команд на http://c2.com/cgi/wiki?CommandPattern, которое может быть полезным.

1
18.08.2008 19:17:42

Вы на правильном пути. В основном у вас будет модель, которая представляет документ. Вы будете использовать эту модель в CutCommand. Вы захотите изменить конструктор CutCommand для принятия информации, которую вы хотите вырезать. Затем каждый раз, скажем, нажата кнопка «Вырезать», вы вызываете новую команду CutCommand и передаете аргументы в конструктор. Затем используйте эти аргументы в классе, когда вызывается метод Execute.

2
21.08.2008 18:42:44

Qt использует шаблон команд для элементов меню / панели инструментов.

QActions создаются отдельно от QMenuItem и QToolbar, а действия могут быть назначены 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

2
29.11.2012 15:45:24
Я понимаю, что пост был 4 года назад, так что это объяснило бы. Но обе ссылки сейчас не работают.
rodrigo-silveira 29.11.2012 05:36:37
Заменены неработающие ссылки ссылкой на их копию archive.org
Imran 29.11.2012 15:48:55

Я не могу помочь вам с примером ссылки, но могу привести пример сам.

1) Определить интерфейс ICommand:

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

2) Сделайте ваши реализации ICommand для конкретных команд, но также определите абстрактный базовый класс для них:

public abstract class WinFormCommand : ICommand {

}

3) Создать команду invoker:

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.

0
29.12.2015 14:24:11