18

私は、基本的な UI を備えた WinForm .Net アプリケーションに取り組んでいます。この UI には、すべて同じ基になるコードを開始するツールバー ボタン、メニュー項目、およびキーストロークが含まれています。現在、これらのそれぞれのイベント ハンドラーは、関数を実行するために共通のメソッドを呼び出します。

私が読んだことから、このタイプのアクションはコマンド デザイン パターンによって処理でき、UI 要素を自動的に有効化/無効化またはチェック/チェック解除するという追加の利点があります。

良いサンプル プロジェクトをネットで検索してきましたが、実際には見つかりませんでした。誰かが共有できる良い例を持っていますか?

4

5 に答える 5

20

まず、Command パターンが何であるかを確認しましょう。

コマンド パターンは、リクエストをオブジェクトとしてカプセル化し、既知のパブリック インターフェイスを提供します。コマンド パターンは、すべてのオブジェクトが独自のコマンドを受信することを保証し、送信者と受信者の間の分離を提供します。送信者は操作を呼び出すオブジェクトであり、受信者は要求を受信して​​それに基づいて動作するオブジェクトです。

これがあなたのための例です。これを行うには多くの方法がありますが、コードをよりテストしやすくするために、インターフェイス ベースのアプローチを採用します。あなたがどの言語を好むかわかりませんが、私はこれを C# で書いています。

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

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.
    }
}

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());
    }
}

この例を取り上げて、作業中のアプリケーションに使用できることを願っています。さらに明確にしたい場合は、お知らせください。

于 2008-08-18T20:51:49.070 に答える
2

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

于 2008-08-21T18:42:44.407 に答える
1

SharpDevelopNotepad++などのオープン ソースの .NET エディターを試してください。

(当然のことながら) http://c2.com/cgi/wiki?CommandPatternにコマンド パターンに関する説明があり、参考になるかもしれません。

于 2008-08-18T19:17:42.347 に答える
1

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

QActions は 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

于 2008-08-21T19:02:32.160 に答える
0

リンクの例についてはお手伝いできませんが、自分で例を提供することはできます。

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 に追加できます。

于 2015-12-29T14:24:11.860 に答える