提起Observer模式,或许有的人不是很清楚,但是MVC框架,相信IT行业的人很少不了解的,而MVC框架则是Observer模式的一个应用实例,从这可以看出,Observer的重要性和实用性,Observer模式要解决的问题是,建立一个一对多的依赖关系,并且当一变化时,依赖一存在的多也随之变化,现在看下Observer的示意图
#include"stdafx.h"
#include"iostream"
#include"string"
#include"list"
using namespace std;
class Observer
{
public:
Observer(){;}
~Observer(){;}
virtual void PintInfo()=0;
virtual void Update(Subject*sub)=0;
private:
string _state;
};
class ConcreteObserver:public Observer
{
public:
Subject* getSubject()
{
return _sub;
}
ConcreteObserver(Subject*sub)
{
_sub=sub;
_sub->Attach(this);//每个观察者都不能是独立存在的,必须是因为要依赖于观察的对象,因而在其构造函数当中就要填入被观察者的指针
}
void Update(Subject*sub)
{
PrintInfo(sub);
_state=sub->GetState();
}
void PrintInfo()
{
cout<<"ConcreteObserver::PrintInfo"<<_state;
}
};
class Subject//Subject类,只是框架的存在现在他与State并没有关系,只是要建立与观察者的依赖关系,在其子类当中才有state的存在意义
{
protected:
Subject(){_listObser=new list<observer>;}
public:
virtual void Notify();
virtual void Attach(Observer*sub)=0;
virtual void Detach(Observer*sub)=0;
~Subject(){delete _listObser;}
private:
list<observer>_listObser;
};
class ConcreteSubject:public Subject
{
public:
ConcreteSubject(string sta)
{
_state=sta;
}
void Notify()
{
for(list<observer>::iterator itr=listObser.begin();itr!=listObser.end();itr++)
{
(*itr) .Update(this);
}
}
void Attach(Observer*sub)
{
_listObser.push_front(sub);
}
void Detach(Observer*sub)
{
_listObser.pop_back(sub);
}
void SetState(string newStata)
{
_state=newStata;
}
string GetState()
{
return _state;
}
private:
string _state;
};
int main(int argc,char* argv[])
{
ConcreteSubject* sub = new ConcreteSubject();
Observer* o1 = new ConcreteObserverA(sub);
Observer* o2 = new ConcreteObserverB(sub);
sub->SetState("old");
sub->Notify();
sub->SetState("new"); //也可以由Observer调用
sub->Notify();
return 0; }
</observer></observer></observer>
其实观察者模式,只是在被观察者的父类当中记录了一系列的观察者指针的容器,当被观察者有所变化时,可以通过容器当中的指针进行通知观察者做出适当的调整
所谓观察者模式,需要两个实现的过程,
1、其一目标对象,要想实现观察者模式其目标对象需要继承一个基类该基类需要有三个接口(因为观察者和被观察这需要进行attach、detach(解注册),以及Notify通知共三个接口)这是因为我们观察者不可能一直进行,可以进行按需要的通知过程、需要注意的是,观察者可能并不只是一个所以在目标对象中会有多个通知对象。
2、进行Notify的目标对象通知多个已经注册的通知对象、然而Notify功能是目标对象发起的,也即如果目标对象有了变化之后却不进行Notify操作,那么就会有问题、所以通知对象也需要拥有目标对象的指针,该指针的作用是获得目标对象的最新信息