Лучший способ реализовать шаблон наблюдателя в Delphi

Я нашел различные реализации шаблона наблюдателя в Delphi, например: Sourcemaking Design Patterns и Delphi Hobbyist.

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

2 ответа

Решение

Не существует "хорошего" или "лучшего" способа реализации шаблонов.
Реализация, которую вы выбираете, зависит от того, как вы хотите ее использовать.

Например, вы также можете использовать универсальную функцию (доступную с Delphi 2009), чтобы упростить использование большого количества шаблонов.

И если вы используете Pre Delphi-3 версии, или хотите избежать reference counting Вы не можете использовать интерфейсы.
(Подсчет ссылок может открыть новую банку червей при смешении с традиционным управлением временем жизни на основе владельца / владельца; обязательно спускайтесь по классам, предоставляющим интерфейсы от правого предка - например, TInterfacedObject - и следите за управлением временем жизни).

Помимо "чистого" вопроса о том, как реализовать шаблон наблюдателя, также хорошо иметь возможность распознавать классы в Delphi, которые реализуют шаблон наблюдателя.

Например, TDataSet/ TDataSource также реализуют шаблон наблюдателя.
От этого зависит вся концепция Data Aware Controls, все они связаны через TDataLink.

Я написал компонент TDataLinkReflector, основанный на TDataLink, который отражает все виртуальные методы в TDataLink на события в TDataLinkReflector,

Основывается на TDataLinkReflector Я написал компоненты TDataAwareControlController, которые делают все виды интересных вещей для Data Aware Controls на основе TDataSet, его TFields и TDataSource, связывающих с TDataSet (раскраска только для чтения, требуется и т. Д.).

Но даже такая, казалось бы, простая вещь, как события, может рассматриваться как основанная на этом паттерне (хотя события являются единичными, поэтому только один наблюдатель может наблюдать одно событие).

Другим классом, реализующим это, является TApplicationEvents; Каждый экземпляр позволяет прослушивать любое из событий в TApplication.

Я надеюсь, что это проливает некоторый свет на то, где в Delphi используются шаблоны наблюдателей.

--jeroen

PS: Любой, кто интересуется компонентами, которые я написал, может захотеть увидеть видео CodeRage, упомянутое здесь.

Хорошая статья с исходным кодом: реализация Observer / Observable в Delphi с использованием интерфейсов

Другие вопросы по тегам