Программная инженерия Андрей Дмитриев ©
Шаблоны проектирования
Стратегия Определяет семейство алгоритмов, инкапсулируя их все и позволяя подставлять один вместо другого во время исполнения программы. Каждый такой алгоритм представляет собой стратегию. Общность программного интерфейса позволяет использовать различные стратегии независимо от контекста их использования.
Стратегия public class Painter extends JComponent { public void paint(int x[], int y[]){ switch(tool){ case Tools.PEN: drawPenLine(x, y); break; case Tools.BRUSH: drawBrushLine(x, y); break; } … Графический пакет позволяет пользователю изменять инструмент рисования:
Стратегия (cont.) switch(tool){ case Tools.PEN: drawPenLine(); break; case Tools.BRUSH: drawBrushLine(); break; case Tools.SPRAY: drawSpray(); break; } … Расширение возможностей пакета требует внесения изменений в класс Painter:
Стратегия (cont.) public abstract class PaintStrategy { //конструктор public PaintStrategy(String title) {…} //обобщенный способ рисовать фигуры public abstract void paint(float x[], float y[]); } Данный подход может быть обобщен. Зададим общий интерфейс для рисования всех возможных фигур:
Стратегия (cont.) public class PenPaintStrategy { //конкретный способ рисовать фигуры public void paint(float x[], float y[]){ //отображение ломаной линии, соединяющей //данные точки } Теперь реализуем класс-стратегию, обладающую возможностью рисовать линии карандашом:
Стратегия (cont.) public class BrushPaintStrategy { public void paint(float x[], float y[]){ //отображение жирной линии, соединяющей //данные точки } Теперь реализуем класс-стратегию, обладающую возможностью рисовать линии кистью:
Стратегия (cont.) public class Painter extends JComponent { PaintStrategy currentStrategy = …; … public void paint(int x[], int y[]){ currentStrategy.paint(x, y); } … Главный класс должен всего лишь передать параметры (координаты точек) текущей стратегии:
Стратегия (выводы) Позволяет сосредоточить специфическую логику в рамках одной сущности В конкретной стратегии Упрощает расширение функциональности программы Ослабляет связность компонентов
Q&A
Спасибо! Андрей Дмитриев ©