Альтернативный шаблон стратегии - PullRequest
3 голосов
/ 22 февраля 2011

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

IStrategy
StrategyA : IStrategy
StrategyB : IStrategy
StrategyC : IStrategy

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

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

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

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

Спасибо.

Ответы [ 4 ]

5 голосов
/ 22 февраля 2011

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

0 голосов
/ 22 февраля 2011

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

0 голосов
/ 22 февраля 2011

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

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

0 голосов
/ 22 февраля 2011

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

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

...