×
Namespaces

Variants
Actions

观察器

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
kcomex 在 29 Mar 2007 创建
最后由 hamishwillee 在 15 Dec 2011 编辑

观察器(Observer)是一种供其他对象去请求回调(callback)函数的对象,回调一般是调用对象希望针对某一事件通知被调用对象(observer)而进行了。对于调用对象来说,它不必知道观察器的其他任何细节,只需要在需要通知观察器事件发生的时候调用观察器的指定函数即可。这种设计在Symbian C++开发中是一种很常见的现象。如下代码演示了如何使用观察器。


观察器的界面示例

class MMyObserver
{
public:
enum TMyEvent
{
EMyEvent1
,EMyEvent2
};
virtual void HandleMyEventL(TMyEvent aEvent) = 0;
};

要想接收事件的回调,观察器需要实现该界面:

// 头文件
class CMyObserver : public CBase,
public MMyObserver
{
//...
protected:
virtual void HandleMyEventL(TMyEvent aEvent);
//...
};
// 源代码文件
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;
};
// 源代码文件
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;
};
// 源代码文件
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();
}
This page was last modified on 15 December 2011, at 13:49.
52 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×