Я думаю, что это распространенный случай злоупотребления паттернами.
Если вы проверите свои две "стратегии", они делают ТОЧНО одно и то же. Единственное, что меняется, это ProvincialTaxRate.
Я бы оставил вещи СУХИМЫМИ и не злоупотреблял бы этим паттерном (или любым другим), здесь вы получаете немного гибкости, но тогда у вас также есть 2 класса, которые не увеличивают вес, и, вероятно, Вам не нужна эта гибкость.
Это часто встречается, когда вы изучаете новую технологию или проницательность, вы хотите применять ее повсюду (это происходит с каждым из нас), даже если это наносит ущерб читабельности и удобству сопровождения кода.
Мое мнение: будь проще
Привет
РЕДАКТИРОВАТЬ (В ответ на комментарий автора на мой ответ)
Я не пытался подшутить над тобой или кем-либо еще. Это распространенная ошибка, я делал это МНОГИЕ раз и изучал ее нелегко, не только с шаблонами, но и с модными фреймворками, серверами, новыми технологиями модных слов, вы назовете это.
Авторы книги сами предупреждают читателей, чтобы они не злоупотребляли шаблонами, и возражения в этом ответе также явно указывают на что-то.
Но если по какой-то причине вы все еще хотите реализовать шаблон, вот мое скромное мнение:
Создание суперкласса для обеих стратегий, этот суперкласс будет абстрактным и должен содержать значение общей ставки их дочерних стратегий (FederalTaxRate)
Унаследовать и реализовать абстрактный метод «Calculate» в каждом подклассе (здесь вы увидите, что оба метода одинаковы, но давайте продолжим)
Постарайтесь сделать каждую конкретную стратегию неизменной, всегда поддерживайте неизменность, как говорит Джошуа Блох. Для этого удалите сеттер ProvincialTaxRate и укажите значение в его конструкторе или непосредственно в его объявлении.
Наконец, я бы создал несколько статических фабричных методов в StrategySuperclass, чтобы вы могли отделить своих клиентов от реализаций или конкретных стратегий (которые теперь могут быть хорошо защищены классами)
Редактировать II:
Вот пример с некоторым (псевдо) кодом, чтобы сделать решение немного более понятным
http://pastie.org/441068
Надеюсь, это поможет
Привет