This page was last modified 20:15, 27 November 2007.
Обозреватель (Observer)
From Forum Nokia Wiki
Перевод с английского, оригинальная статья находится здесь.
Шаблон проектирования Observer (обозреватель) используется для реализации следующей логики: наблюдаемый объект, при изменении собственного состояния, производит оповещение объектов-обозревателей, которые должны предварительно зарегистрироваться (подписаться на изменения). Наблюдаемому объекту ничего не нужно знать об обозревателях, кроме набора вызываемых callback-функций, описанных в интерфейсе (M-классе). Такой шаблон достаточно часто используется при разработке ПО для Symbian C++.
Пример интерфейса обозревателя
class MMyObserver { public: enum TMyEvent { EMyEvent1, EMyEvent2 }; virtual void HandleMyEventL(TMyEvent aEvent) = 0; };
Для получения событий, класс должен реализовать интерфейс обозревателя:
// заголовочный файл class CMyObserver : public CBase, public MMyObserver { //... private: virtual void HandleMyEventL(TMyEvent aEvent); //... };
// cpp файл void CMyObserver::HandleMyEventL(MMyObserver::TMyEvent aEvent) { switch (aEvent) { case MMyObserver::EMyEvent1 : { //... } break; case MMyObserver::EMyEvent2 : { //... } break; default : break; } }
Для того, чтобы подписаться на изменения, объект-наблюдатель должен передать указатель на самого себя (this) наблюдаемому объекту:
void CMyObserver::ConstructL() { //... iObjectSendingEventsToItsObservers->SetObserver(this); //... }
Для этого, наблюдаемый объект должен содержать необходимые функции для регистрации наблюдателя:
// заголовочный файл class CObjectSendingEventsToItsObservers : public CBase { public: //... void SetObserver(MMyObserver* aObserver); //... private: MMyObserver* iObserver; };
// cpp файл void CObjectSendingEventsToItsObservers::SetObserver(MMyObserver* aObserver) { iObserver = aObserver; }
При изменении собственного состояния, наблюдаемый объект может оповещать зарегистрированного обозревателя, вызывая соответствующие функции:
if (iObserver) { iObserver->HandleMyEventL(MMyObserver::EMyEventX); }
Для оповещения множества наблюдателей, можно использовать массив, в котором хранить указатели на все оповещаемые объекты:
// заголовочный файл class CObjectSendingEventsToItsObservers : public CBase { public: //... void SetObserverL(MMyObserver* aObserver); void RemoveObserver(MMyObserver* aObserver); //... private: //... void NotifyObserversL(MMyObserver::TMyEvent aEvent); private: RPointerArray<MMyObserver> iObserverArray; };
// cpp файл void CObjectSendingEventsToItsObservers::SetObserverL(MMyObserver* aObserver) { iObserverArray.AppendL(aObserver); } void CObjectSendingEventsToItsObservers::RemoveObserver(MMyObserver* aObserver) { TInt pos = iObserverArray.Find(aObserver); if (pos >= 0) { iObserverArray.Remove(pos); } } void CObjectSendingEventsToItsObservers::NotifyObserversL(MMyObserver::TMyEvent aEvent) { for (TInt index = 0; index < iObserverArray.Count(); index++) { iObserverArray[index]->HandleMyEventL(aEvent); } } CObjectSendingEventsToItsObservers::~CObjectSendingEventsToItsObservers() { iObserverArray.Close(); }
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| problem in adding buttons... | platinnum | General Symbian C++ | 1 | 2005-04-25 03:58 |
| About get a Sms from Inbox! | starryshen | General Symbian C++ | 0 | 2004-04-13 06:06 |
| Gallery Observer in Series 60 | aayushgarg | General Symbian C++ | 2 | 2006-10-11 17:57 |
| Multiselection listbox with a twist | jarjak | Symbian User Interface | 1 | 2004-05-26 15:25 |
| Getting Name of active Theme | ArneH | Symbian User Interface | 5 | 2005-05-11 17:43 |
