
interface Strategy {
int doOperation(int a, int b);
}
//ConcreteStrategy
class AddStrategy implements Strategy {
public int doOperation(int a, int b) {
return a + b;
}
}
//ConcreteStrategy
class SubstractStrategy implements Strategy {
public int doOperation(int a, int b) {
return a - b;
}
}
//Context
class Calc {
Strategy strategy;
public int execute(int a, int b) {
if (strategy == null)
return 0;
return strategy.doOperation(a, b);
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
var calc = new Calc();
var result1 = calc.execute(5, 3);
//result1 is 0
calc.setStrategy(new AddStrategy());
var result2 = calc.execute(5, 3);
//result2 is 8
calc.setStrategy(new SubstractStrategy());
var result3 = calc.execute(5, 3);
//result3 is 2
System.out.println("result1 is " + result1);
System.out.println("result2 is " + result2);
System.out.println("result3 is " + result3);
| Определяет семейство алгоритмов, инкапсулируя их и позволяя подставлять один вместо другого. Можно менять алгоритм независимо от клиента, который им пользуется. |