2015-10-06 3 views
5

Я следую пример стратегии шаблона из hereНевозможно понять стратегию шаблон

Все в учебнике ясно, но это:

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

выше будучи интерфейсом, контекст класс ожидает, что объект типа стратегии. В классе StrategyPatternDemo мы делаем:

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

Я совершенно запутался, что мы не можем инициализировать интерфейс в соответствии с определением:

интерфейс отличается от класса несколькими способами, в том числе:

Вы не можете создать интерфейс.

Как именно это Context context = new Context(new OperationAdd()); послал в качестве аргумента public Context(Strategy strategy){ this.strategy = strategy; }

+2

Вам необходимо создать (по крайней мере) класс, который реализует интерфейс «Стратегия». Очевидно, что «OperationAdd» и другие будут такими классами. – SJuan76

+0

Прочтите Шаг 2 в учебнике: «Создайте конкретные классы, реализующие один и тот же интерфейс», который предоставляет реализации типа «public class OperationAdd» реализует Strategy {'. Это то, что вы создаете, а не «Стратегия». –

+0

У меня есть, я хочу понять, как класс OperationAdd преобразуется в тип стратегии? Потому что он реализует стратегию? Если я инициирую операцию «Добавить», как она принимается в качестве аргумента стратегии? – User3

ответ

4

Классы OperationAdd, OperationSubstract и OperationMultiply все реализуют интерфейс Strategy. Поэтому экземпляры этих классов могут быть переданы в конструктор Context, который ожидает объект типа Strategy.

Как OperationAdd, OperationSubstract и OperationMultiply реализуют интерфейс Strategy, все они этого типа.

2

Вы, вероятно, не хватает этих строк, в начале примера:

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

Здесь вы можете видеть, что есть некоторые «операция ", которые реализуют интерфейс стратегии. Класс, который реализует интерфейс, в основном является «фактическим экземпляром» этого интерфейса.

Вы можете думать, таким образом, если это понятней:

  • Интерфейс представляет собой представление «поведения»;
  • класс, который реализует этот интерфейс, является тем, что может «вести себя как состояния интерфейса»;
  • Метод, который принимает «интерфейс» в качестве аргумента, - это метод, который просто хочет объект, который «может вести себя», как состояния интерфейса, и он не имеет против реального класса объекта, который передается как аргумент.
+0

Я не пропустил классы, но это «Здесь вы можете увидеть, что есть некоторые« операционные »классы, которые реализуют интерфейс Strategy. Класс, который реализует интерфейс, в основном является «фактическим экземпляром» этого интерфейса. »Объясняет это :) – User3

2

Речь идет об интерфейсах и классах. List - это интерфейс, ArrayList и LinkedList - это classe, реализующие этот интерфейс.

Это имеет смысл иметь:

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

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

printList(books); 

Это позволяет быть общим, будучи в состоянии изменить реализацию.

Смежные вопросы