设计模式入门学习 观察者模式

  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 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可用单例来创建,保证其全局唯一。


你可能感兴趣的:(设计模式)