Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2014, 12:58   #1
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию паттерн стратегия

день добрый.
не понимаю, в чем принципиальная разница между использованием данного паттерна и использовании обычной иерархии классов. к примеру, есть классы, реализующие алгоритмы архивации RARCompression, ZIPCompression, ARJCompression, являющиеся наследниками класса Compression, и определяют метод compress. В соответствии с парадигмой паттерна, мы
должны создать некий вспомогательный класс Compressor, который будет держать ссылку на абстрактный Compression и делегировать вызов compress.
утверждается, что Strategy предоставляет возможность замены одного алгоритма другим в процессе выполнения программы. хотелось бы увидеть на примере, как это можно делать и будет ли это проще, чем в том случае, когда мы работаем на с классом Compressor, а Compression. утверждается также, что Strategy позволяет скрыть детали реализации алгоритмов от клиента. но если Compression - интерфейс, чего еще надо скрывать?
sashonk вне форума Ответить с цитированием
Старый 13.04.2014, 23:07   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

На вики есть примеры. Далее, данный паттерн имеет смысл использовать только для сложных каких-то систем. В большинстве случаев более наглядно обычное условие или селектор. Да даже если требуется переделка, то переписать имена классов (в случае полиморфизма) намного проще чем городить такой огород.
Цитата:
в чем принципиальная разница между использованием данного паттерна и использовании обычной иерархии классов
Иерархия классов всего лишь описание, паттерн это некоторый шаблон по которому строится код.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 13.04.2014 в 23:13.
Utkin вне форума Ответить с цитированием
Старый 14.04.2014, 14:00   #3
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

почитайте еще про Dependency Injection и Inversion of Control.
buriat вне форума Ответить с цитированием
Старый 14.04.2014, 18:41   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Пишем свою стратегию выделения памяти для vector, а потом так:
Код:
vector<int, CMyMemoryAllocator> data;
Самый простой пример(взят из книги Александреску) это стратегия Creator<T> с методом Create который возвращает указатель на объект класса T. Можно определить несколько стратегий Creator:
Код:
template <class T>
struct NewCreator{...};

template <class T>
struct MallocCreator{...};

template <class T>
struct PrototypeCreator{...};

template <template <class> class CreationPolicy = NewCreator>
class WidgetManager : public CreationPolicy<Widget> {...};

typedef WidgetManager<MallocCreator> MyWidgetManager;

...

auto w = MyWidgetManager::Create();
И тут начинается крутотень, т.к. класс WidgetManager знает Creator, то он может создать с его помощью не только виджеты, но и гаджеты, и печеньки, и котлеты ...

Правда я не вижу смысла использовать стратегии если вы пишите что-то конкретное, а не гибкую библиотеку с кучей настроек типа своего GUI или framework'а
Kostia вне форума Ответить с цитированием
Старый 14.04.2014, 20:30   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
И тут начинается крутотень,
Конечно, селектором так сделать нельзя, это да. Я уже молчу что такая крутотень не очевидна и потому будет первым источником ошибок. Код (даже Ваш собственный) в первую очередь должен быть понятным, а не крутым.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.04.2014, 22:52   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Я уже молчу что такая крутотень не очевидна и потому будет первым источником ошибок.
Какого рода ошибок? Вас смутил шаблонный шаблонный параметр?
Цитата:
Код (даже Ваш собственный) в первую очередь должен быть понятным, а не крутым.
Автор дабы облегчить жизнь рядовому программисту заранее определил стратегию создания объекта по умолчанию. Рядовому Васи Пупкину осталось лишь:

Код:
Widget * widget1 = WidgetManager::Create();
И что тут может быть непонятного?

Хотя признаю, на втором курсе Александреску не осилил =(, только к концу третьего.

Последний раз редактировалось Kostia; 14.04.2014 в 22:56.
Kostia вне форума Ответить с цитированием
Старый 15.04.2014, 07:16   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
И что тут может быть непонятного?
Какая печенька когда создастся. Проблемы всплывут при отладке кода. Когда неочевидная хитропопая стратегия будет создавать то одно, то другое по одному креатору.
В общем, на мой взгляд, идея спорная и, ИМХО, нет ни одного преимущества при использовании обычных там IF'ов или Case.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 15.04.2014, 21:00   #8
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Какая печенька когда создастся.
Зачем вам это знать? Всё что должен уметь Creator так это создавать объекты класса T. А WidgetManager должен создавать и возвращать указатель на Widget. Хотя Васи Пупкину достаточно знать только последнее. А уж как потом WidgetManager освобождает память и т.д. это касается уже только разработчика самой библиотеки.
Kostia вне форума Ответить с цитированием
Старый 16.04.2014, 06:12   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Зачем вам это знать? Всё что должен уметь Creator так это создавать объекты класса T. А WidgetManager должен создавать и возвращать указатель на Widget. Хотя Васи Пупкину достаточно знать только последнее. А уж как потом WidgetManager освобождает память и т.д. это касается уже только разработчика самой библиотеки.
Я про разработчика и разработку и говорю.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.04.2014, 18:10   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Давайте сделаем мысленный эксперимент:

Две группы программистов параллельно развивают продукт: "полигон для животных".

Заказчик захотел, что бы на полигоне жили волки и овцы.
Волки - хищники, и питаются овцами.
Овцы - травоядные, и убегают от хищников.

-----------------
Ребята из первой группы выделили общее у животных и завели интерфейс
IAnimal

От которого унаследовали волка и овцу, которые реализуют собственно само поведение животных.
Итого: 1 интерфейс, и два класса.

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

Повесили картинку волка - получился волк.
Повесили картинку овцы - получилась овца.

А вот поведение же животных они сделали в виде параметра животного - стратегия.
Назначая ту или иную стратегию животному, можно легко менять его поведение.

Итого: один класс животного, 1 интерфейс стратегии, 2 стратегии для волка и овцы соответственно.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паттерн Registry SoftKoc PHP 4 27.07.2013 01:07
Паттерн Начинающий програм Помощь студентам 0 20.05.2013 19:41
Паттерн наблюдадель. c# Skull_psyhothik Помощь студентам 0 22.04.2013 20:38
паттерн singleton zhenya.ya Общие вопросы C/C++ 1 26.11.2010 03:11
Паттерн MVP Vistar Общие вопросы .NET 0 11.09.2010 18:45