戦略パターン対デコレータパターン 質問する

戦略パターン対デコレータパターン 質問する

2つのパターンに遭遇しました。

  1. 戦略パターン

  2. デコレーター

戦略パターン:-

戦略パターンは、特定の操作またはタスクを実行するために使用できるいくつかのアルゴリズムを提供します。

デコレータパターン :-

デコレータ パターンはコンポーネントにいくつかの機能を追加します。

実際、私は戦略パターンとデコレーターパターンは互換的に使用することもできます。

リンクはこちらです:-デコレータ パターンの代わりに戦略パターンをいつどのように適用できますか?

戦略パターンとデコレータパターンの違いは何ですか?

いつ戦略パターンを使用し、いつデコレータパターンを使用すべきですか?

同じ例を使って両者の違いを説明してください。

ベストアンサー1

戦略パターンにより、変化実行時に使用されるものの実装。

デコレータ パターンを使用すると、実行時に追加機能を使用して既存の機能を拡張 (または追加) できます。

重要な違いは変化増強

リンク先の質問の 1 つでは、戦略パターンでは消費者がさまざまなオプションが存在することを認識しているのに対し、デコレータ パターンでは消費者が追加機能に気付かないことも指摘されています。

たとえば、要素のコレクションをソートする何かを書いているとします。そこで、ISortingStrategyいくつかの異なるソート戦略 、、 を実装できるBubbleSortStrategyインターフェイスを作成しQuickSortStrategyRadixSortStrategyアプリケーションは既存のリストのいくつかの基準に基づいて、リストをソートするために使用する最も適切な戦略を選択します。たとえば、リストの項目が 10 個未満の場合は を使用しRadixSortStrategy、前回のソート以降にリストに追加された項目が 10 個未満の場合は を使用し、BubbleSortStrategyそれ以外の場合は を使用しますQuickSortStrategy

実行時にソートの種類を変更します (追加情報に基づいて効率を上げるため)。これが戦略パターンです。

さて、各ソートアルゴリズムが実際にソートを行うためにどのくらいの頻度で使用されているかのログを提供し、ソートを管理者ユーザーのみに制限するように求められたとします。これらの機能の両方を追加するには、デコレータを作成して、どれでも ISortingStrategy何かをソートするために使用されたことと、デコレートされたソート戦略のタイプをログに記録するデコレータを作成できます。また、デコレートされたソート戦略を呼び出す前に、現在のユーザーが管理者であるかどうかを確認する別のデコレータを追加することもできます。

ここでは新しい機能を追加していますソート戦略デコレータを使用していますが、コアソート機能は交換していません(これを変更するためにさまざまな戦略を使用しました)

デコレータの例を次に示します。

public interface ISortingStrategy
{
    void Sort(IList<int> listToSort);
}

public class LoggingDecorator : ISortingStrategy
{
    private ISortingStrategy decorated;
    public LoggingDecorator(ISortingStrategy decorated)
    {
         this.decorated=decorated;
    }

    void Sort(IList<int> listToSort)
    { 
         Log("sorting using the strategy: " + decorated.ToString();
         decorated.Sort(listToSort);
    }
}

public class AuthorisingDecorator : ISortingStrategy
{
    private ISortingStrategy decorated;
    public AuthorisingDecorator(ISortingStrategy decorated)
    {
         this.decorated=decorated;
    }

    void Sort(IList<int> listToSort)
    { 
         if (CurrentUserIsAdministrator())
         {
             decorated.Sort(listToSort);
         }
         else
         {
             throw new UserNotAuthorizedException("Only administrators are allowed to sort");
         }
    }
}

おすすめ記事