Реализация шаблона Mediator в Delphi без получения циклических ссылок - PullRequest
8 голосов
/ 25 января 2011

Для тех, кто знаком с моделью Посредника ...

Я хочу реализовать шаблон Mediator в Delphi, но компилятор Delphi не может обрабатывать требуемые циклические ссылки.

Глядя на исходную диаграмму GOF из «Шаблонов проектирования», Посредник имеет ссылку на каждого Коллега, но многие объекты Коллеги имеют ссылку на Посредника.

Это не проблема в большинстве языков, но мой компилятор Delphi дает мне 'F2047 Ссылка на круговую единицу ...'

Будет ли такой подход , использующий интерфейсы, каким-либо образом использоваться? (кажется сложным)

Я использую Delphi 2010

[ Краткое изложение решения ]

Просто для краткого изложения принятого ответа: На языках, которые допускают циклические ссылки, вы можете опустить абстрактный класс-посредник (как обсуждалось в разделе «Реализация» GoF на стр. 278). Единственный способ реализовать Mediator в Delphi без абстрактного класса Mediator - это собрать все свои классы в одном модуле .

В противном случае вам потребуется дополнительный абстрактный базовый класс Mediator в дополнение к конкретному подклассу.

Ваши условия использования для трех юнитов будут выглядеть так:

ConcreteColleage1 использует медиатор
БетонМедиатор использует медиатор, ConcreateColleague1
Медиатор (тоже не используется)

Нет циклических ссылок!

Ответы [ 3 ]

7 голосов
/ 25 января 2011

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

5 голосов
/ 25 января 2011

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

Чтобы реализовать эту диаграмму в Delphi, вам действительно нужно написать

  • либоMediator интерфейс (и ваш класс ConcreteMediator реализует этот интерфейс)
  • или базовый Mediator класс с виртуальными методами, (и ваш класс ConcreteMediator наследуется от Mediator и переопределяет ихметоды).
2 голосов
/ 25 января 2011

Другой вариант, который следует рассмотреть, - это разместить Медиатора и Коллегу в одном подразделении.Во многих ситуациях это идиоматический способ Delphi избегать циклических ссылок.

Использование interfaces часто является хорошим подходом к такого рода проблемам, но иногда это может привести к дополнительной сложности без реальной выгоды.

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

...