Не существует "хорошего" или "наилучшего" способа реализации шаблонов.
Реализация, которую вы выбираете, зависит от того, как вы хотите ее использовать.
Вы можете, например, также использовать функцию обобщений (доступно с 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, упомянутое здесь .