2015-10-06 10 views
5

Mam następujący przykład wzorca strategii z herew stanie zrozumieć strategiczne wzór

wszystko w tutorialu jest jasne, ale w ten sposób:

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); 
    } 
} 

Więc klasa Context oczekuje argumentu strategii w jej konstruktora.

Definicja strategii jest:

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

Powyższe jest interfejs, klasa Context oczekuje obiekt typu strategii. W klasie StrategyPatternDemo robimy:

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)); 
    } 
} 

jestem kompletnie zdezorientowany jak mogę init, interfejs zgodnie z definicją:

interfejs różni się od klasy na kilka sposobów, w tym:

Nie można utworzyć instancji interfejsu.

Jak to dokładnie jest ten Context context = new Context(new OperationAdd()); wysłany jako argument do public Context(Strategy strategy){ this.strategy = strategy; }

+2

Musisz utworzyć (przynajmniej) klasę, która implementuje interfejs 'Strategy'. Oczywiście, "OperationAdd" i inni będą takimi klasami. – SJuan76

+0

Przeczytaj Krok 2 w samouczku: "Utwórz konkretne klasy implementujące ten sam interfejs.", Który daje implementacje takie jak 'public class OperationAdd implementuje Strategy {'. To właśnie tworzysz, a nie "Strategię". –

+0

Mam, chcę zrozumieć, jak klasa OperationAdd jest konwertowane na typ strategii? Ponieważ wdraża strategię? Jeśli jestem w trakcie operacji Dodaj, w jaki sposób jest akceptowany jako argument strategii? – User3

Odpowiedz

4

Klasy OperationAdd, OperationSubstract i OperationMultiply wszystkie implementują interfejs Strategy. Dlatego wystąpienia tych klas można przekazać do konstruktora Context, który oczekuje obiektu typu Strategy.

Jak OperationAdd, OperationSubstractOperationMultiply i implementować interfejs Strategy, wszyscy są tego typu.

2

Prawdopodobnie brakuje tych linii, na początku przykładu:

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

Tutaj można zobaczyć, że istnieją pewne „operacja "klasy implementujące interfejs strategii. Klasa implementująca interfejs to w zasadzie "faktyczna instancja" tego interfejsu.

można myśleć w ten sposób, czy to jaśniej wam:

  • Interface jest przedstawieniem „zachowania”;
  • klasa, która implementuje ten interfejs, może "zachowywać się jak stany interfejsu";
  • Metoda akceptująca "interfejs" jako argument jest metodą, która po prostu chce obiektu, który "może zachowywać się" jak stany interfejsu, i nie ma nic przeciwko faktycznej klasie obiektu, która jest przekazywana jako argument.
+0

Nie przegapiłem zajęć, ale to "Tutaj widać, że istnieją pewne klasy" operacji ", które implementują interfejs strategii. Klasa implementująca interfejs to po prostu "faktyczna instancja" tego interfejsu. "Wyjaśnia to :) – User3

2

Chodzi o interfejsy i klasy. List to interfejs, ArrayList i są classe implementujące ten interfejs.

ma sens mają:

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

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

printList(books); 

Pozwala to jest uniwersalne, a jest w stanie zmienić implementację.