l 概念:
观察者模式是把目标对观察者的依赖进行抽象:使目标只知道自己有若干观察者,但不知道这些观察者具体是谁,可能有多少个;当目标状态改变时只要给这些观察者一个通知,不必作更多的事情。这样目标对观察者的依赖就达到了抽象和最小,而目标对具体观察者的依赖被解除了。
l 背景:
1. 观察者模式要解决的问题为:建立一个(subject)对多(observer)的依赖关系,并且做到当‘一’变化时,依赖这个‘一’的多也能够同步改变。
2. M类也叫混合类,通常包括纯虚函数,并用作抽象接口。
M类的特点:
Ø 不含有任何数据成员
Ø 不含有构造函数、析构函数或重载描述符
Ø 含有纯虚函数,是抽象类
l 作用:
建立一个一对多的依赖关系,并且做到“一”变化的时候,依赖这个一的多也能够同步改变.
l 实现:
1. 定义接口类class
class MHTTPEngineObserver //观察器基类(M类)
{
public:
//回调函数
virtual void ResponseReceivedL() = 0;
};
//接口,它有一个纯虚函数,它必须被一个创建类实现。
2. Obervers实现接口
class CLxdTextView : public MHTTPEngineObserver //观察器
{
public:
void ResponseReceivedL(); // 对从M类继承来的纯虚函数进行重新实现
void ConstructL();
private:
//定义一个CHTTPEngine类的指针
CHTTPEngine* iHttpEngine;
};
3. 向数据发送方注册
void CLxdTextView ::ConstructL()
{
iHttpEngine = new (ELeave) CHTTPEngine(*this);
};
4. 注册Obervers对象的指针
class CHTTPEngine //被观察者
{
private:
MHTTPEngineObserver& iObserver;//定义一个M类的引用
public:
CHTTPEngine(MHTTPEngineObserver& aObserver);//引用必须初始化,切记!
void DoSomething();
};
5. 调用接口类的函数
case THTTPEvent::EResponseComplete:
{
iIfCompleted = ETrue;
// Pass the response buffer by reference to the observer
iObserver.ResponseReceivedL(*iResponseBuffer);// 回调函数
iTimerOut->Cancel();
}
break;