Observer观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
简单而且常用的设计模式,Symbian开发中应用的极广泛。
组成:
抽象目标:1. 目标知道它的观察者,可以有任意多个观察者观察同一个目标。2. 提供注册和删除观察者对象的接口。
抽象观察者:为那些在目标发生改变时需要获得通知的对象定义一个接口。
具体目标:1. 保存有关状态存 2. 当它的状态发生改变时,向它的各个观察者发出通知。
具体观察者:1. 维护一个指向具体目标对象的引用 2. 存储有关状态,这些状态应该与目标状态一致。 3. 实现观察者接口。
代码示例:
//观察者模式
class Subject;
//抽象观察者
class Observer
{
public:
virtual ~Observer();
virtual void Update(Subject* theChangeSub) = NULL;
protected:
Observer();
};
//抽象目标
class Subject
{
public:
virtual ~Subject();
virtual void Attach(Observer* aOb)
{
iObList.Append(aOb);
}
virtual void Detach(Observer* aOb)
{
TInt find = iObList.Find(aOb);
if (find != KErrNotFound)
iObList.Remove(find);
}
virtual void Notify()
{
for (TInt i = 0; i < iObList.Count(); i++)
iObList[i]->Update(this);
}
protected:
Subject();
private:
RPointerArray<Observer> iObList;//观察者列表
};
//具体目标
class ClockTimer : public Subject
{
public:
ClockTimer();
virtual int GetTime();
void Tick()//由内部定时器每隔一秒调用
{
//做时间处理等等
Notify();
}
};
//具体观察者
class DigitalClock : public Observer
{
public:
DigitalClock(ClockTimer* timer)
{
subject = timer;
subject->Attach(this);
}
~DigitalClock()
{
subject->Detach(this);
}
void Update(Subject* theChangeSub)
{
if (subject == theChangeSub)
/*做显示操作*/;
}
private:
ClockTimer* subject;
};
class AnalogClock : public Observer{/*实现同上略*/};
//简单使用
ClockTimer* timer = new ClockTimer();
DigitalClock* clock = new DigitalClock(timer);
AnalogClock* anaClock = new AnalogClock(timer);
//这样timer走动,两个时钟都会更新
相关设计模式
Mediator备忘录模式:通过封装复杂的更新语义,使用ChangerManager处理观察者和目标间的关系。
Singleton单例模式:ChangerManager可用单例来创建,保证其全局唯一。