Strategyパターンのコンテキストクラス


10

私は戦略パターンを理解しようとして自分自身に問いかけています。コンテキストクラスはなくてはならないのですか、それともパターンの目的を損なうことなく省略できますか?

さまざまな種類のファイルを読み取るためになんらかのスイッチが必要であるという印象を受けましたが、何かをハックして後でリファクタリングを処理したくありませんでした(もちろん、コードは常にリファクタリングされる可能性がありますが、アイデアは:設計をできるだけスマートにするために...):

ここに画像の説明を入力してください

ウィキメディアから撮影した画像

クライアントはストラテジーインターフェイスに直接委任できますか、それともコンテキストクラスについて理解できなかったことがありますか?

interface Reader {
    // read information from file and fill data list field of Client
    readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}

class Client{
    // strategic choice
    Reader r;

    // data list field
    List<Data> data;

    // Client Constructor
    public Client(){
        if(<file ends in .xls>)
            r = new ExcelReader();
        else
            r = new PdfReader();
        r.readFile();
    }
}

したがって、上記のコンテキストクラスはありません。コードは戦略パターンに準拠していますか?


1
もう1つの興味深い重要な点として、関数型言語の型クラスの概念は、「単純に」種類en.wikipedia.org/wiki/Kind_(type_theory)を使用した戦略パターンであることに注意してください。どちらも、アドホックなポリモーフィズムの実装メカニズムにすぎません。
AndreasScheinert 2013

これは(はるかに少ない)Java 8 Project Lambdaに関連していますか?ウィキペディアの記事は密度が高すぎてすぐには理解できませんが、Javaの今後の機能(またはプログラミング全般)を効率的に使用するための理論的背景の一部である場合は、より多くの時間を喜んで投入します。
パニー

1
非常に遠いですが、私はそう主張します。型クラスが必要です。より高い種類をサポートするプログラミング言語。scalaとHaskellの場合もそうです。ここでの私のポイントは、(その場限りの)ポリモーフィズムの実装方法が異なることであり、一歩後退すると、ポリモーフィズム全般についての洞察を得ることができます。
AndreasScheinert 2013

回答:


13

あなたの例では、コード呼び出しreadFileはクライアントコンストラクタの一部です。そのメソッドは、あなたが探している「コンテキスト」です。戦略パターンには文字通り「コンテキストクラス」は必要ありません。コードの最初のバージョンでは、戦略オブジェクト(この場合は「リーダー」)がローカル変数にのみ存在する場合があります。特に呼び出される「戦略的メソッド」(「readFile」)が1つしかない場合。

ただし、コードベースが1つのバージョンから次のバージョンに成長する場合、呼び出される「戦略的」メソッドが増えることはまずありません。適用する戦略の決定と「戦略的メソッド」の実行は異なるタイミングで発生します。コード内のさまざまな場所。したがって、ロジックを1か所に保持するためにリファクタリングを開始します。これは、質問の図に似た実装に直接つながります。


5

もちろん。パターンは単なるガイドラインです。それでも、目前の問題に適切に適合させて適用する必要があります。個人的には、実行時に戦略を設定できることはほとんどありません。多くの場合、建設時に指定されるか、工場でスピンアップされます。

それsetStrategyはプライベートであると主張することもできますが、私の注射は示されているパターンを使用しています。


これは、描かれたContextクラスがパターンを損なうことなく省略できることを意味しますか?または別の言い方をすると、クライアントクラス描かれたコンテキストクラスである場合、それは問題ありませんか?
パニー

6
@panny-答えのポイントを逃したことを示しているため、質問に答えることをためらっています。戦略パターンを使用すると、インターフェースの背後に異なる具体的な実装を提供することで、動作を変えることができます。これは概念であり、公式ではありません。
Telastyn 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.