понедельник, 7 января 2013 г.

Паттерны Ruby. Паттерн стратегия.


Паттерн Шаблонный метод основан на наследовании, что не дает нам быть настолько гибкими, насколько мы хотим. Решением недостатков Шаблонного метода является паттерн стратегия (Strategy).
Почему бы вместо постоянного создания подклассов не изолировать только изменяющиеся кусочки кода в своих отдельных классах.


Диаграмма классов шаблона Стратегия




Пример с тем же самым классом Report:


В данном случае мы передаем "форматировщик" объекту класса Report при его создании. При этом Report знает только то, что форматировщик отзывается на сообщение ouptup_report и вызывает его c аргументами @text и @title. Но что если вместо аргументов передавать контекст, откуда форматировщик будет "вытаскивать" необходимые значения сам? Обратите внимание, что теперь output_report теперь принимает context, в который передается self. Также заметим, что нет реальной необходимости в классе Formatter, так как Ruby является динамически типизированным языком, поэтому создание интерфейсов типа этого является довольно искусственным.
Удалим интерфейс Formatter и перепишем классы с учетом передаваемого контекста:

Таким образом, стратегия еще более отделяется от использующего ее класса, но ценой этого является передача большого числа данных через контекст и нет никакой гарантии, что стратегия будет их использовать.


Комментариев нет:

Отправить комментарий