C++设计模式浅识观察者模式

来源:互联网 发布:node-http-proxy原理 编辑:程序博客网 时间:2024/06/05 10:27

观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

模式实现:

//观察者抽象基类class Observer{public:    virtual void Update(int) = 0;};//主题、目标class Subject{public:    virtual void Attach(Observer *) = 0;  //重视    virtual void Detach(Observer *) = 0; //脱离    virtual void Notify() = 0; //通知};class ConcreateObserver: public Observer{private:    Subject *m_pSubject;   //1.具体观察者,维护一个指向ConcreteSubject对象的引用2.存储有关状态,这些状态应与目标的状态保持一致public:                     //3.实现Observer的更新接口以使自身状态与目标的状态保持一致    ConcreateObserver(Subject *pSubject): m_pSubject(pSubject){}    void Update(int value){        std::cout << "ConcreateObserver get the update. New State: " << value << std::endl;    }};class ConcreateObserver2: public Observer{private:    Subject *m_pSubject;public:    ConcreateObserver2(Subject *pSubject):m_pSubject(pSubject){}    void Update(int value){        std::cout << "ConcreateObserver2 get the update. New State: " << value << std::endl;    }};//1.将有关状态存入各ConcreateObserver对象//2.当它的状态发生改变时,向它的各个观察者发出通知class ConcreateSubject: public Subject{private:    std::list<Observer *> m_ObserverList;    int m_iState;public:    void Attach(Observer *pObserver);    void Detach(Observer *pObserver);    void Notify();    void setState(int state){        m_iState = state;    }};void ConcreateSubject::Attach(Observer *pObserver){    m_ObserverList.push_back(pObserver);}void ConcreateSubject::Detach(Observer *pObserver){    m_ObserverList.remove(pObserver);}void ConcreateSubject::Notify(){    std::list<Observer *>::iterator it = m_ObserverList.begin();    while(it != m_ObserverList.end()){        (*it)->Update(m_iState);        ++it;    }}

客户端:

int main(){    //Create Subject    ConcreateSubject *pSubject = new ConcreateSubject();    //Create Observer    Observer *pObserver = new ConcreateObserver(pSubject);    Observer *pObserver2 = new ConcreateObserver2(pSubject);    //Change the state    pSubject->setState(2);    //Register the observer    pSubject->Attach(pObserver);    pSubject->Attach(pObserver2);    pSubject->Notify();  //Output: ConcreateObserver get the update. New State: 2                                  //ConcreateObserver2 get the update. New State: 2    //Unregister the observer    pSubject->Detach(pObserver);    pSubject->setState(3);    pSubject->Notify();  //Output: ConcreateObserver2 get the update. New State: 3    delete pObserver;    delete pObserver2;    delete pSubject;}
0 0
原创粉丝点击