Альтернативный шаблон стратегии

У меня есть фрагмент кода, в котором я начал размещать шаблон стратегии, скажем, следующим образом:

IStrategy
StrategyA : IStrategy
StrategyB : IStrategy
StrategyC : IStrategy

В интерфейсе есть только метод Calculate. После реализации оказалось, что все 3 конкретных типа имеют одинаковый код метода Calculate и два одинаково названных свойства, только с разными заданными значениями.

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

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

Может ли кто-нибудь предложить какие-либо другие подходы, пожалуйста, оставьте меня, чтобы было легко добавить новые «Стратегии» в будущем. Может оказаться, что нам нужно изменить логику в некоторых из этих новых случаев, так как я могу структурировать это, чтобы у меня не было повторяющегося кода, но был гибкий дизайн, который позволяет мне изменять вещи в процессе?

Спасибо.


person Mike    schedule 22.02.2011    source источник


Ответы (4)


Другой альтернативой, которую вы можете использовать, является шаблон Шаблон. Но у него есть проблема: он позволяет вам изменять алгоритм для новых случаев, но очень ограниченным образом.

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

person nanda    schedule 22.02.2011

Почему бы вам не создать класс abstract class BaseStrategy со всеми общими функциями и не расширить его во всех конкретных стратегиях?

person Bozho    schedule 22.02.2011

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

Это должно произойти естественным образом, когда вы кодируете, ни один шаблон не сможет чудесным образом решить цель, которую вы пытаетесь достичь.

person Eduard    schedule 22.02.2011

Иметь интерфейс IStrategy. Абстрактный класс BaseStrategy, реализующий IStrategy. Таким образом, вы можете расширять или реализовывать интерфейс на основе наличия или отсутствия общего кода, и клиент может ссылаться на интерфейс.

person Siva    schedule 22.02.2011