2008-08-18 14 views
13

私はWinForm .Netアプリケーションで、基本的なUI(ツールバーのボタン、メニュー項目、キーストロークがすべて同じ基底コードを開始する)を使って作業しています。現在、これらのそれぞれのイベントハンドラは、その機能を実行するための共通のメソッドを呼び出します。UIのコマンドパターンの例を探して

私はこのタイプのアクションをCommand design patternで処理することができ、UIエレメントを自動的に有効/無効にしたりチェックしたりすることができます。

私は良いサンプルプロジェクトをネットで検索してきましたが、本当に見つからなかったのです。誰かが共有できる良い例がありますか?

答えて

16

てみましょう最初の我々はCommandパターンが何であるかを知っていることを確認してください。

Commandパターンをオブジェクトとして要求 をカプセル化し、それを知ら パブリックインターフェイスを提供します。コマンドパターン は、すべてのオブジェクトが自身のコマンドである を確実に受信し、送信者と受信者の間でデカップリングを提供します( )。送信者 は 操作を呼び出すオブジェクトであり、受信者は要求を受け取り、 で動作するオブジェクト です。

次に例を示します。これを行うにはさまざまな方法がありますが、私はコードをよりテスト可能にするためのインタフェースベースのアプローチをとるつもりです。あなたが好きな言語はわかりませんが、C#でこれを書いています。

まず、コマンドを記述するインタフェースを作成します。

public interface ICommand 
{ 
    void Execute(); 
} 

第2に、コマンドインターフェイスを実装するコマンドオブジェクトを作成します。

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

第3に、インボーカまたは送信者オブジェクトをセットアップする必要があります。

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

第4に、呼び出し元/送信者オブジェクトを使用するクライアントオブジェクトを作成します。

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

私がこの例を挙げると、あなたが作業しているアプリケーションに使用できることを望みます。より明確にしたい場合は、私に知らせてください。

2

あなたは正しいトラックにいます。基本的には、ドキュメントを表すモデルがあります。 CutCommandでこのモデルを使用します。カットしたい情報を受け入れるように、CutCommandのコンストラクターを変更する必要があります。次に、Cut Buttonがクリックされるたびに、新しいCutCommandを呼び出して、コンストラクターに引数を渡します。次に、Executeメソッドが呼び出されたときにクラス内のこれらの引数を使用します。

1

Qtは、メニューバー/ツールバー項目にコマンドパターンを使用します。

QActionはQMenuItemとQToolbarから別々に作成され、アクションはそれぞれsetAction()メソッドとaddAction()メソッドでQMenuItemとQToolbarに割り当てることができます。

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

+0

私は4年前の投稿だったので、それはそれを説明するだろうと思います。しかし、両方のリンクが壊れています。 –

+1

brokenリンクをarchive.orgのコピーへのリンクに置き換えました – Imran

0

Iは、例えば、リンクのお手伝いをすることはできませんが、自分で例を提供することができます。コマンドの呼び出しを作成します)

public abstract class WinFormCommand : ICommand { 

} 

3::)

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

2具体的なコマンドのためにあなたのICommandの実装を行いますが、また、それらの抽象基本クラスを定義します。

1)のICommandインターフェイスを定義

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、IButtonDirectまたは、ICheckBoxDirectorなどの他のインターフェイスをWinFormsCommandInvokerに追加します。

関連する問題