Szukanie przykładowego wzorca poleceń dla UI [closed]

zamknięte. to pytanie nie spełnia wytycznych dotyczących przepełnienia stosu . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the pytanie więc to on-topic {[3] } dla przepełnienia stosu.

Zamknięte 2 lata temu .

Popraw to pytanie

Pracuję nad aplikacją WinForm. Net z podstawowym interfejsem użytkownika, który zawiera przyciski paska narzędzi, elementy menu i naciśnięcia klawiszy, które inicjują ten sam kod. W tej chwili obsługa zdarzeń dla każdego z nich wywołanie wspólnej metody do wykonania funkcji.

Z tego, co czytałem, tego typu działania mogą być obsługiwane przez wzór konstrukcyjny polecenia z dodatkową korzyścią automatycznego włączania/wyłączania lub sprawdzania/odznaczania elementów interfejsu użytkownika.

Szukałem w sieci dobrego przykładowego projektu, ale tak naprawdę go nie znalazłem. Czy ktoś ma dobry przykład, którym można się podzielić?

Author: Rick, 2008-08-18

5 answers

Najpierw upewnijmy się, że wiemy jaki jest wzorzec polecenia:

Wzorzec polecenia zawiera żądanie jako przedmiot i nadaje mu znany publiczny interfejs. Wzór Polecenia zapewnia, że każdy obiekt otrzymuje swoje własnych poleceń i zapewnia oddzielenie pomiędzy nadawcą a odbiorcą. Nadawca jest obiektem, który wywołuje działanie, A odbiornik jest obiektem który otrzymuje wniosek i działa na to.

Oto przykład dla Ciebie. Istnieje wiele sposoby można to zrobić, ale mam zamiar podjąć podejście podstawy interfejsu, aby Kod bardziej testowalne dla Ciebie. Nie jestem pewien, jaki język preferujesz, ale piszę to w C#.

Najpierw Utwórz interfejs opisujący polecenie.

public interface ICommand
{
    void Execute();
}

Po Drugie, Utwórz obiekty poleceń, które będą implementować interfejs poleceń.

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

Po trzecie, musimy skonfigurować nasz obiekt invoker lub sender.

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

Po czwarte, Utwórz obiekt klienta, który będzie używał wywoływacza/nadawcy obiekt.

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

Mam nadzieję, że możesz wziąć ten przykład i zastosować go do aplikacji, nad którą pracujesz. Jeśli chcesz więcej wyjaśnień, daj mi znać.

 20
Author: Dale Ragan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-18 20:51:49

Twój na dobrej drodze. Zasadniczo będziesz mieć model, który reprezentuje dokument. Będziesz używać tego modelu w poleceniu CutCommand. Będziesz chciał zmienić konstruktor CutCommand, aby zaakceptować informacje, które chcesz wyciąć. Następnie za każdym razem, powiedzmy, że Przycisk Cut został kliknięty, wywołujesz nową komendę CutCommand i przekazujesz argumenty w konstruktorze. Następnie użyj tych argumentów w klasie podczas wywoływania metody Execute.

 2
Author: Dale Ragan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-21 18:42:44

Wypróbuj open source, edytory. NET, takie jak SharpDevelop lub Notepad++.

Istnieje (naturalnie) pewne omówienie wzorca poleceń w http://c2.com/cgi/wiki?CommandPattern to może być pomocne.

 1
Author: ESV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-18 19:17:42

Qt używa wzorca poleceń dla elementów paska menu/paska narzędzi.

Działania Q są tworzone oddzielnie z QMenuItem i QToolbar, a akcje można przypisać odpowiednio do QMenuItem i QToolbar za pomocą metod setAction() i 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

 1
Author: Imran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-29 15:45:24

Nie mogę ci pomóc z przykładowym linkiem, ale mogę sam podać przykład.

1) Zdefiniuj interfejs ICommand:

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

2) wykonaj swoje implementacje ICommand dla konkretnych poleceń, ale także zdefiniuj dla nich abstrakcyjną klasę bazową:

public abstract class WinFormCommand : ICommand {

}

3) Utwórz wywołanie polecenia:

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) Teraz możesz zaimplementować ICommandsBuilder, IButtonDirector i dodać inne interfejsy, takie jak ICheckBoxDirector do WinFormsCommandInvoker.

 0
Author: Dzianis Yafimau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 14:24:11