C#でコマンドデザインパターンを使用する方法

デザインパターンは、一般的なデザインの問題を解決し、コードの複雑さを軽減するために使用される実証済みのソリューションです。ギャングオブフォーのデザインパターンは、次の3つのカテゴリに分類されます。

  • 作成—オブジェクトの作成に関連するパターン
  • 構造—オブジェクトアセンブリに関連するパターン
  • 行動—オブジェクトのコラボレーションと責任の分離に関連するパターン

コマンドデザインパターンは、動作パターンのカテゴリに分類されます。この記事では、C#でコマンドデザインパターンを操作する方法について説明します。

コマンドデザインパターンとは何ですか?

コマンドデザインパターンの目的は、アクションのリクエスターを、アクションを実行するオブジェクトから切り離すことです。コマンドデザインパターンでは、リクエストは、リクエストに関するすべての情報を含むオブジェクトとしてカプセル化されます。次に、このオブジェクトは呼び出し元オブジェクトに渡されます。次に、呼び出し元オブジェクトは、コマンドを処理するための適切なオブジェクトを探し、コマンドをオブジェクトに渡します。

コマンドデザインパターンは、コールバック、キューイングタスク、履歴の追跡、および元に戻す/やり直し機能をアプリケーションに実装する場合に適しています。コマンドパターンは、再試行メカニズムを実装するのに適しています。アプリケーションが、現時点では稼働していないサービスへの接続を後で再試行する場合です。コマンドパターンは、メッセージキューアプリケーション、つまりデータ損失から回復する必要があるアプリケーションでも使用されます。

コマンドデザインパターンの参加者

コマンドパターンの従来の実装では、コマンド、呼び出し側、受信側、およびクライアントの4つのコンポーネントがあります。コマンドデザインパターンの参加者は次のとおりです。

  • コマンド—操作を実行するためのインターフェースを提供します
  • ConcreteCommand —コマンドインターフェイスを拡張し、Executeメソッドを実装します
  • クライアント—ConcreteCommandクラスをインスタンス化します
  • 呼び出し元—要求を実行するようにコマンドに通知します
  • レシーバー—リクエストに関連する操作を実行するためのロジックが含まれています

C#でのコマンドデザインパターンの例

次のセクションでは、コマンドデザインパターンを実装する方法について説明します。この例では、次のクラスを使用して簡単な計算機を実装します。

  • コマンド(コマンド抽象基本クラス)
  • SimpleCalculator(レシーバークラス)
  • AddCommand(具体的なコマンドクラス)
  • SubstractCommand(具体的なコマンドクラス)
  • 乗算コマンド(具体的なコマンドクラス)
  • DivideCommand(具体的なコマンドクラス)
  • 発動者(発動者クラス)

C#でコマンド抽象基本クラスを作成します

Executeメソッドの宣言を含むCommandという名前の次の抽象基本クラスについて考えてみます。

パブリック抽象クラスコマンド

    {{

        保護されたSimpleCalculatorレシーバー。

        public Command(SimpleCalculatorレシーバー)

        {{

            this.receiver =レシーバー;

        }

        public abstract int Execute();

    }

次の列挙型は、単純な計算機でサポートされる操作を示しています。

public enum CommandOption

    {{

        加算、減算、乗算、除算

    }

C#でReceiverクラスを作成します

以下は、SimpleCalculatorという名前のクラスです。このクラスはレシーバーとして機能し、Add、Subtract、Multiply、およびDivideメソッドの定義が含まれています。

パブリッククラスSimpleCalculator

    {{

        private int _x、_y;

        public SimpleCalculator(int a、int b)

        {{

            _x = a;

            _y = b;

        }

        public int Add()

        {{

            _x + _yを返します。

        }

        public int Subtract()

        {{

            return _x-_y;

        }

        public int Multiply()

        {{

            return _x * _y;

        }

        public int Divide()

        {{

            _x / _yを返します。

        }

    }

C#で具体的なコマンドクラスを作成します

具象コマンドクラスは、コマンド抽象基本クラスを拡張し、以下に示すようにExecuteメソッドを実装します。

 パブリッククラスAddCommand:コマンド

    {{

        プライベートSimpleCalculator_calculator;

        public AddCommand(SimpleCalculator計算機):base(計算機)

        {{

            _calculator =計算機;

        }

        public override int Execute()

        {{

            return _calculator.Add();

        }

    }

    パブリッククラスSubtractCommand:コマンド

    {{

        プライベートSimpleCalculator_calculator;

        public SubtractCommand(SimpleCalculator計算機):

        基数(電卓)

        {{

            _calculator =計算機;

        }

        public override int Execute()

        {{

            return _calculator.Subtract();

        }

    }

    パブリッククラスMultiplyCommand:コマンド

    {{

        プライベートSimpleCalculator_calculator;

        public MultiplyCommand(SimpleCalculator計算機):

        基数(電卓)

        {{

            _calculator =計算機;

        }

        public override int Execute()

        {{

            return _calculator.Multiply();

        }

    }

    パブリッククラスDivideCommand:コマンド

    {{

        プライベートSimpleCalculator_calculator;

        public DivideCommand(SimpleCalculator計算機):

        基数(電卓)

        {{

            _calculator =計算機;

        }

        public override int Execute()

        {{

            return _calculator.Divide();

        }

    }

C#でInvokerクラスを作成します

次のコードスニペットは、Invokerクラスを示しています。SetCommandとExecuteの2つのメソッドが含まれています。SetCommandを使用してコマンドオブジェクトをInvokerクラスのプライベートコマンド参照に割り当てますが、Executeはコマンドを実行するために使用されます。

    パブリッククラスの呼び出し元

    {{

        プライベートコマンド_command;

        public void SetCommand(コマンドコマンド)

        {{

            _command =コマンド;

        }

        public int Execute()

        {{

            return _command.Execute();

        }

    }

C#で動作中のコマンドデザインパターン

最後に、次のコードスニペットは、SimpleCalculatorクラスを使用して簡単な計算を実行する方法を示しています。

static void Main(string [] args)

        {{

            SimpleCalculator計算機=新しいSimpleCalculator(15、3);

            var addCommand = new AddCommand(calculator);

            var substractCommand = new SubtractCommand(calculator);

            var multiplyCommand = new MultiplyCommand(calculator);

            vardivideCommand = new DivideCommand(calculator);

            Invoker invoker = new Invoker();

            invoker.SetCommand(addCommand);

            Console.WriteLine( "結果は{0}"、invoker.Execute());

            invoker.SetCommand(substractCommand);

            Console.WriteLine( "結果は{0}"、invoker.Execute());

            invoker.SetCommand(multiplyCommand);

            Console.WriteLine( "結果は{0}"、invoker.Execute());

            invoker.SetCommand(divideCommand);

            Console.WriteLine( "結果は{0}"、invoker.Execute());

            Console.ReadLine();

        }

コマンドデザインパターンは、拡張性のサポートを提供し、コマンドの呼び出し側と受信側の間に存在する結合を減らします。リクエストはスタンドアロンオブジェクトにカプセル化されているため、さまざまなリクエストでメソッドをパラメータ化したり、リクエストをキューに保存したり、やり直しや取り消しが可能な操作をサポートしたりすることもできます。

C#でさらに多くのことを行う:

  • C#でAutoMapperを操作する方法
  • C#で抽象クラスとインターフェイスを使用する場合
  • C#でスレッドを操作する方法
  • C#でDapperORMを使用する方法
  • C#でリポジトリデザインパターンを実装する方法
  • C#で簡単なロガーを実装する方法
  • C#でデリゲートを操作する方法
  • C#でAction、Func、およびPredicateデリゲートを操作する方法
  • C#でlog4netを操作する方法
  • C#でリフレクションを操作する方法