UIのコマンドパターンの例を探しています [終了]
-
08-06-2019 - |
質問
私は、同じ基礎となるコードを開始するツールバー ボタン、メニュー項目、キーストロークを含む基本的な UI を備えた WinForm .Net アプリケーションに取り組んでいます。現時点では、これらのそれぞれのイベント ハンドラーは、関数を実行するために共通のメソッドを呼び出します。
私が読んだところによると、このタイプのアクションは コマンド設計パターン さらに、UI 要素を自動的に有効/無効にしたり、チェック/チェックを外したりできるという利点もあります。
良いサンプル プロジェクトをネットで探していますが、実際には見つかりませんでした。誰かが共有できる良い例を持っていますか?
解決
まず、コマンド パターンが何であるかを確認しましょう。
コマンドパターンは、リクエストをオブジェクトとしてカプセル化し、既知のパブリックインターフェイスを提供します。コマンドパターンは、すべてのオブジェクトが独自のコマンドを受信し、送信者と受信機の間の分離を提供することを保証します。送信者は操作を呼び出すオブジェクトであり、レシーバーはリクエストを受信してそれに作用するオブジェクトです。
ここに例を示します。これを行う方法はたくさんありますが、コードをよりテストしやすくするために、インターフェイス ベースのアプローチを採用します。どの言語がお好みかわかりませんが、私はこれを 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.
}
}
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());
}
}
この例を参考にして、あなたが取り組んでいるアプリケーションに活用していただければ幸いです。さらに詳しい説明が必要な場合は、お知らせください。
他のヒント
あなたは正しい道を進んでいます。基本的に、ドキュメントを表すモデルが存在します。このモデルは CutCommand で使用します。切り取りたい情報を受け入れるように CutCommand のコンストラクターを変更するとよいでしょう。次に、Cut ボタンがクリックされるたびに、新しい CutCommand を呼び出し、コンストラクターに引数を渡します。次に、Execute メソッドが呼び出されるときに、クラス内でこれらの引数を使用します。
オープンソース、.NET エディターなどを試してみる シャープ開発 または メモ帳++.
コマンド パターンについては (当然のことながら) いくつかの議論があります。 http://c2.com/cgi/wiki?CommandPattern それは役立つかもしれません。
Qt はメニューバー/ツールバー項目にコマンド パターンを使用します。
QAction は 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
サンプルのリンクを提供することはできませんが、自分でサンプルを提供することはできます。
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 に追加できます。