Паттерн стратегия используется для сокрытия (инкапсуляции) алгоритмов. То есть, у вас есть несколько путей решения одной и той же проблемы — сортировки строк, например, но они очень отличаются в производительности, требованиям к ресурсам и проч. Для этого вы реализуете несколько алгоритмов сортировки:
- Cортировку вставками (Insertion sort), сортирующую за конечное время и эффективному при небольших массивах, а также с частично отсортированными массивами
- Быструю сортировку (Quicksort), сортирующую быстрее, но требующую O(log n) дополнительной памяти
- Сортировку подсчетом (Counting sort), эффективный для большого количества данных с небольшим разбросом значений
Далее, в зависимости от типа данных что у нас есть, и их объема, решаем какой алгоритм предпочтительнее использовать.
Вот как паттерн Стратегия, выглядит на UML диаграмме:
А вот пример на языке java, из уже классической, игровой тематики:
// IUnitRender.java
package patterns.strategy;
public interface IUnitRender {
public void render();
}
// UnitRender2D.java
package patterns.strategy;
public class UnitRender2D implements IUnitRender {
@Override
public void render() {
System.out.println("2D unit");
}
}
// UnitRender3D.java
package patterns.strategy;
public class UnitRender3D implements IUnitRender {
@Override
public void render() {
System.out.println("3D unit");
}
}
// UnitSprite
package patterns.strategy;
public class UnitSprite {
private IUnitRender render;
public UnitSprite(IUnitRender render) {
this.render = render;
}
public void render() {
render.render();
}
}
// TestApp.java
package patterns.strategy;
public class TestApp {
public static void main(String[] args) {
UnitSprite unit;
if(TestApp.hasVideoAdapter()) {
unit = new UnitSprite(new UnitRender3D());
} else {
unit = new UnitSprite(new UnitRender2D());
}
unit.render();
}
public static Boolean hasVideoAdapter() {
return true;
}
}