观察者模式:
为对象建立一种“通知依赖”关系,当一个对象(目标对象)的状态发生变化时,所有的依赖对象(观察者对象)都得到通知并自动更新。
观察者模式,又称发布-订阅模式,其所作的工作就是在解除耦合,弱化依赖关系,采用面向对象技术,让耦合的双方都依赖于抽象,而不是依赖于具体,将这二者封装在独立的对象中以使它们可以独立的改变和复用。
观察者模式中的四类角色:
1.Subject(目标):抽象的目标类,提供增加和删除观察者对象的的方法,以及一个抽象的Notify方法(通知机制),目标类可以是接口,也可以是抽象类和具体类。
2.ConcreteSubject:具体目标类,实现抽象目标类的接口,同时增加了设置对象状态属性和获取状态属性的方法。
3.Obserber(观察者/订阅者):观察者抽象类,提供了一个更新状态的抽象接口。
4.ConcterteObserver1/ConcreteObserver2:具体观察者类,实现抽象类的接口,并增加了一个显示当前状态的函数。
//观察者模式实现
#include<iostream>
#include<list>
using namespace std;
//Observer
class Observer
{
public:
Observer(){};
virtual ~Observer(){};
//更新状态的接口
virtual void Update(int)=0;
};
//Subject
class Subject
{
public:
Subject(){};
virtual ~Subject(){};
virtual void Add(Observer*)=0;//增加观察者对象
virtual void Remove(Observer*)=0;//删除观察者对象
virtual void Notify()=0;//通知机制
};
//ConcreteObserver
class ConcreteObserver1: public Observer
{
public:
ConcreteObserver1(Subject* pSubject):m_pSubject(pSubject){};
virtual ~ConcreteObserver1(){};
void Update(int value)
{
cout<<"ConcreteObserver1 Update,and the New Satate:"<<value<<endl;
}
private:
Subject* m_pSubject;
};
class ConcreteObserver2:public Observer
{
public:
ConcreteObserver2(Subject* pSubject):m_pSubject(pSubject){};
virtual ~ConcreteObserver2(){};
void Update(int value)
{
cout<<"ConcreteObserver2 Upadate,and the New State:"<<value<<endl;
}
private:
Subject* m_pSubject;
};
//ConcreteSubject
class ConcreteSubject:public Subject
{
public:
void Add(Observer* pObserver)
{
m_Observerlist.push_back(pObserver);
}
void Remove(Observer* pObserver)
{
m_Observerlist.remove(pObserver);
}
void Notify()
{
list<Observer*>::iterator iter=m_Observerlist.begin();
while(iter!=m_Observerlist.end())
{
(*iter)->Update(m_State);
iter++;
}
}
void setState(int state)
{
m_State=state;
}
private:
list<Observer*> m_Observerlist;
int m_State;
};
int main()
{
//创建目标对象
ConcreteSubject *pSubject=new ConcreteSubject();
//创建观察者对象
Observer *pObserver1=new ConcreteObserver1(pSubject);
Observer *pObserver2=new ConcreteObserver2(pSubject);
//改变状态
pSubject->setState(2);
//添加观察者
pSubject->Add(pObserver1);
pSubject->Add(pObserver2);
//通知
pSubject->Notify();
//删除观察者
pSubject->Remove(pObserver1);
pSubject->setState(3);
pSubject->Notify();
delete pSubject;
delete pObserver1;
delete pObserver2;
}