您的位置:首页 > 其它

大话设计模式学习(十一)——观察者模式

2010-08-03 22:31 441 查看
观察者模式又叫发布—订阅模式。它定义了一种一对多的依赖关系,让多个观察着对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己



Subject类,可以翻译为主体或者抽象主题,一般用一个抽象类或者一个接口实现
class Subject {
public:
//增加观察者
void Attach(Observer* observer)
{
observers.push_back(observer);
}
//移除观察者
void Detach(Observer* observer)
{
for (vector<Observer *>::iterator iter=observers.begin();iter!=observers.end();iter++)
{
}
}
//通知
void Notify()
{
for (vector<Observer *>::iterator iter=observers.begin();iter!=observers.end();iter++)
{
}
}
private:
vector<Observer *> observers;
};

observer类,抽象观察者。包含一个Update()的更新方法
class Observer {
public:
virtual void Update()=0;

};

ConcreteSubject类,具体主题或者具体通知者
class ConcreteSubject : public Subject {
public:
//被观察着状态
CString SubjectState;
};

concreteObserver类,具体观察者
class ConcreteObserver : public Observer {
public:
ConcreteObserver(ConcreteSubject* pSubject,CString strName)
{
this->m_pSubject=pSubject;
this->m_strName=strName;
}

CString m_strObserverState;
CString m_strName;

void Update()
{
m_strObserverState=m_pSubject->SubjectState;
CString strInfo;
strInfo.Format(_T("观察者{%s}的新状态是{%s}"),m_strName,m_strObserverState);
cout<<strInfo<<endl;
}
private:
ConcreteSubject *m_pSubject;
};

客户端代码:
void main()
{
ConcreteSubject* s=new ConcreteSubject;
ConcreteObserver* pObserver1=new ConcreteObserver(s,_T("X"));
ConcreteObserver* pObserver2=new ConcreteObserver(s,_T("Y"));
s->Attach(pObserver1);
s->Attach(pObserver2);
s->SubjectState=_T("ABC");
s->Notify();
}


输出:
观察者X的新状态是ABC
观察者Y的新状态是ABC

当一个对象的改变需要通知其他对象,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: