Расширить шаблон стратегии: добавить методы контекста и подклассы - PullRequest
1 голос
/ 16 февраля 2012

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

Очень мило. Но рассмотрим следующую ситуацию: у меня есть шаблон стратегии с несколькими подклассами контекста и несколькими алгоритмами, как показано ниже. Код должен быть закрыт для модификации в конце, но мне все еще нужно иметь возможность достичь следующих расширений. Без изменений в существующий код:

  1. Добавить новые методы к Context, которые используют Стратегию
  2. Добавить новые подтипы Context

Strategy pattern diagram

Я думал о Посетитель , что хорошо для достижения 1). Но добавление новых подтипов Context потребует изменений во всех Visitor s, поэтому это не работает.

А как насчет Декоратор ? Украсив Context, вы можете добавить новые методы. Но что мне действительно нужно, так это добавить методы с конкретными реализациями, которые могут варьироваться, как в шаблоне стратегии.

Как вы думаете, как этого достичь?

С уважением

richn

EDIT:

Это конкретный пример. enter image description here

Я должен объяснить: у меня есть приложение с окном моделирования, показывающим различные виды VisibleObject с, и другое окно для управления этими объектами. Состояние VisibleObject s должно быть отражено в симуляции с использованием стратегии. Например, если я отключу Polygon, он должен быть скрыт в симуляции или полностью удален, в зависимости от его конкретного DisablingBehavior.

Если новый тип VisibleObject, скажем, Picture определен, я хочу, чтобы все существующие DisablingBehaviors и PositioningBehaviors могли с ним справиться.

И если есть новая операция, скажем, MirrorObject(), которую необходимо выполнить на VisibleObjects Я хочу иметь возможность определять различные MirroringBehaviors поведения, такие как AxisMirroring или PointMirroring, и назначать их VisibleObject s.

Ответы [ 2 ]

1 голос
/ 04 мая 2012

Шаблоны проектирования не охватывают все ситуации. Вы не должны слепо следовать какому-либо шаблону или пытаться подобрать программное обеспечение для соответствия некоторому шаблону. Вот цитата из книги Роберта К. Мартина:

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

0 голосов
/ 17 февраля 2012

Похоже, вам может понадобиться паттерн Мост: http://en.wikipedia.org/wiki/Bridge_pattern.

Это не защитит вас от добавления новых методов. Я почти уверен, что никакая модель не может помочь в этом случае. Когда вы добавляете открытые методы в интерфейсы и / или базовые классы, вы изменяете (не расширяете!) Важные контракты со всеми вытекающими последствиями.

...