Лучший способ реализовать шаблон наблюдателя в 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 с использованием интерфейсов