2015-10-06 33 views
5

を理解することができませんすべてが明確ではなく、このです:私は<a href="http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm">here</a></p> <p>から戦略パターンの例を、以下の午前Strategyパターン

public class Context { 
    private Strategy strategy; 

    public Context(Strategy strategy){ 
     this.strategy = strategy; 
    } 

    public int executeStrategy(int num1, int num2){ 
     return strategy.doOperation(num1, num2); 
    } 
} 

だから、Contextクラスがそのコンストラクタで戦略引数を期待しています。

戦略の定義は:インターフェースである上記

public interface Strategy { 
    public int doOperation(int num1, int num2); 
} 

ザ、コンテキストクラスタイプ戦略のオブジェクトを期待します。定義によれば

public class StrategyPatternDemo { 
    public static void main(String[] args) { 
     Context context = new Context(new OperationAdd());   
     System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); 

     context = new Context(new OperationSubstract());  
     System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); 

     context = new Context(new OperationMultiply());  
     System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); 
    } 
} 

私たちはカントとして全く混乱していますインターフェイスを初期化:StrategyPatternDemoクラスでは、我々はやる

インタフェースには、いくつかの方法でクラスとは異なります。

インタフェースをインスタンス化することはできません。

public class OperationSubstract implements Strategy{ 
    @Override 
    public int doOperation(int num1, int num2) { 
     return num1 - num2; 
    } 
} 
... // etc. 

ここではいくつかの「操作があることがわかります。このContext context = new Context(new OperationAdd());あなたはおそらく例の冒頭で、これらの行が欠落しているpublic Context(Strategy strategy){ this.strategy = strategy; }

+2

'少なくとも'戦略 'インターフェイスを実装するクラスを作成する必要があります。明らかに、「OperationAdd」と他のクラスはそのようなクラスになります。 – SJuan76

+0

チュートリアル:「同じインタフェースを実装する具象クラスを作成する」のステップ2を読んでください。これは 'public class OperationAdd Strategic {'を実装します。それが「戦略」ではなく、あなたが具体化しているものです。 –

+0

私は、クラスOperationAddが戦略タイプにどのように変換されるのか理解したいと思いますか?それは戦略を実装しているからですか?私がオペレーションを開始している場合、それをストラテジー引数としてどのように受け入れますか? – User3

答えて

4

クラスOperationAdd,OperationSubstractおよびOperationMultiplyはすべて、インターフェイスStrategyを実装しています。したがって、これらのクラスのインスタンスは、Strategyのオブジェクトを必要とするContextのコンストラクタに渡すことができます。

OperationAddとして

OperationSubstractOperationMultiplyインタフェースStrategyを実装して、彼らはそのタイプのすべてです。

2

の引数として送信されますどのように正確に

戦略インターフェースを実装するクラスです。 インターフェイスを実装するクラスは、基本的にそのインターフェイスの「実際のインスタンス」です。

それはあなたに明確だ場合は、この方法を考えることがあります。

  • インタフェースは「行動」の表現です。
  • そのインターフェイスを実装するクラスは、「インターフェイスステートのように動作できる」ものです。
  • "インタフェース"を引数として受け入れるメソッドは、インタフェース状態のように "振る舞い"できるオブジェクトを単純に要求するメソッドであり、渡されるオブジェクトの実際のクラスは気にしません引数。
+0

私はクラスを逃したことはありませんでしたが、この 'ここでは、戦略インターフェイスを実装するいくつかの"操作 "クラスがあることがわかります。インターフェイスを実装するクラスは基本的にそのインターフェイスの「実際のインスタンス」です。 – User3

2

これはインターフェイスとクラスに関するものです。 Listはインターフェイスであり、ArrayListおよびLinkedListはそのインターフェイスを実装しています。

それは感覚を持つようになります:

List<String> books = new ArrayList<>(); 

void printList(List<String> list) { ... } 

printList(books); 

この実装を変更することができるという、一般的なことができます。

関連する問題