大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
当一个subject的状态变化时,多个observer的状态需要跟着变化。
subject内部存放多个observer的指针,observer提供一个更新自身状态的接口供subject调用。
当subject状态变化时,调用observer的更新接口。

#include <iostream>
#include 
<list>
#include 
<algorithm>

using namespace std;


class Observer;
//被观察的目标
class Subject
{
public:
    Subject(
int i):state(i){}
    
//添加观察者
    void Attach(Observer* p)
    
{
        olist.push_back(p);
    }

    
//去掉观察者
    void Detach(Observer* p)
    
{
        list
<Observer*>::iterator iter;
        iter 
= find(olist.begin(),olist.end(),p);
        
if (olist.end() != iter)
        
{
            olist.erase(iter);
        }

    }

    
void Notify();
    
void SetState(int i)
    
{
        state 
= i;
    }

    
int    GetState() const
    
{
        
return state;
    }

private:
    list
<Observer*> olist;
    
int state;
}
;

//观察者
class Observer
{
public:
    Observer(
int i):state(i){}
    
//更新状态
    void Update(Subject* p)
    
{
        state 
= p->GetState();
        cout
<<state<<endl;
    }

private:
    
int state;
}
;

class ObserverA: public Observer
{
public:
    ObserverA(
int i=0):Observer(i){}
}
;

class ObserverB: public Observer
{
public:
    ObserverB(
int i = 0):Observer(i){}
}
;

//依次更新观察者的状态
void Subject::Notify()
{
    list
<Observer*>::iterator iter;
    
for (iter = olist.begin();iter != olist.end(); ++iter)
    
{
        (
*iter)->Update(this); 
    }

}


int main()
{
    Observer
* pa = new ObserverA;
    Observer
* pb = new ObserverB;
    Subject s(
4);

    s.Attach(pa);
    s.Attach(pb);
    s.Notify();

    s.SetState(
7);
    s.Notify();

    s.Detach(pb);
    s.Notify();

    delete pb;
    delete pa;
    
    
return 0;
}
posted on 2009-06-10 15:12 大胖 阅读(131) 评论(0)  编辑 收藏 引用 所属分类: Design Pattern

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理