ООП для чайников. Паттерны проектирования. Паттерн стратегия (Strategy)

Паттерн стратегия используется для сокрытия (инкапсуляции) алгоритмов. То есть, у вас есть несколько путей решения одной и той же проблемы — сортировки строк, например, но они очень отличаются в производительности, требованиям к ресурсам и проч. Для этого вы реализуете несколько алгоритмов сортировки:

  1. Cортировку вставками (Insertion sort), сортирующую за конечное время и эффективному при небольших массивах, а также с частично отсортированными массивами
  2. Быструю сортировку (Quicksort), сортирующую быстрее, но требующую O(log n) дополнительной памяти
  3. Сортировку подсчетом (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;
	}
 
}

Comments

comments


Bookmark and Share