Při pohledu například Command vzorem pro UI

hlasů
13

Pracuji na aplikaci WinForm NET se základním uživatelským rozhraním, které obsahuje tlačítka panelu nástrojů, položky menu a stisky kláves, že všechny iniciovat stejný základní kód. Právě teď událostí manipulátory na každé z nich volat společnou metodu k provedení této funkce.

Z toho, co jsem četl tento druh akce by mohla být zpracována návrhového vzoru Command s dodatečným prospěch automatické zapnutí / vypnutí nebo kontrolu / odškrtnutím prvky uživatelského rozhraní.

Hledal jsem na netu k dobrým příkladem projektu, ale ve skutečnosti nebyly nalezeny jeden. Má někdo dobrý příklad, který může být sdíleny?

Položena 18/08/2008 v 19:31
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
17

Podívejme se nejprve ujistit, že víme, co Command vzor:

Příkaz vzor zapouzdřuje žádost jako objekt a dává mu známou veřejné rozhraní. Příkaz vzor zajišťuje, že každý objekt přijímá své vlastní příkazy a zajišťuje oddělení mezi odesílatelem a příjemcem. Odesílatel je objekt, který vyvolá operaci, a přijímač je objekt, který obdrží žádost a působí na něj.

Zde je příklad pro vás. Existuje mnoho způsobů, jak to udělat, ale hodlám vzít rozhraní základní přístup, aby byl kód více testovatelné pro vás. Nejsem si jistý, v jakém jazyce si přejete, ale píšu to v jazyce C #.

Za prvé, vytvoření rozhraní, která popisuje příkaz.

public interface ICommand
{
    void Execute();
}

Za druhé, vytvořit příkazové objekty, které budou realizovat příkaz rozhraní.

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

Za třetí, musíme nastavení našeho Vyvolávač nebo odesílatele objektu.

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

Za čtvrté, vytvořit objekt klienta, který bude používat objekt volající / odesílatel.

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

Doufám, že si můžete vzít tento příklad a vložte jej do provozu pro aplikaci, na kterém pracujete. Máte-li zájem o bližší vysvětlení, dejte mi vědět.

Odpovězeno 18/08/2008 v 21:51
zdroj uživatelem

hlasů
2

Váš na správné cestě. V podstatě budete mít model, který představuje dokument. Budete používat tento model v CutCommand. Budete chtít změnit CutCommand v konstruktoru přijmout informace, které chcete vyjmout. Pak pokaždé, říkají, že Button Cut klepnutí vyvolat novou CutCommand a předávání argumenty v konstruktoru. Pak použít tyto argumenty ve třídě, když je volána metoda Execute.

Odpovězeno 21/08/2008 v 19:42
zdroj uživatelem

hlasů
1

Qt používá příkaz k modelu Menubar / položky panelu nástrojů.

QActions jsou vytvořeny odděleně od QMenuItem a QToolbar a akce mohou být přiřazeny k QMenuItem a QToolbar s setAction () a způsobu addAction () v tomto pořadí.

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

Odpovězeno 21/08/2008 v 20:02
zdroj uživatelem

hlasů
1

Vyzkoušet open source .NET editorů jako SharpDevelop nebo Notepad ++ .

K dispozici je (přirozeně) nějaká diskuze Command Pattern na http://c2.com/cgi/wiki?CommandPattern , které by mohly být užitečné.

Odpovězeno 18/08/2008 v 20:17
zdroj uživatelem

hlasů
0

Nemohu vám pomoci například odkazem, ale může poskytnout příklad sám.

1) Definovat ICommand rozhraní:

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

2) Do své implementace ICommand konkrétních příkazů, ale také definovat abstraktní základní třída pro ně:

public abstract class WinFormCommand : ICommand {

}

3) Vytvořit příkaz Vyvolávač:

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) Nyní můžete implementovat ICommandsBuilder, IButtonDirector a přidat další rozhraní, jako je ICheckBoxDirector do WinFormsCommandInvoker.

Odpovězeno 29/12/2015 v 14:24
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more