现在的位置: 首页 > 综合 > 正文

设计模式C++实现 ——观察者模式

2013年04月18日 ⁄ 综合 ⁄ 共 1310字 ⁄ 字号 评论关闭

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主与读者之间存在种一对多的依赖关系。下面给出相应的UML图设计。


       可以看到博客类中有一个观察者链表(即订阅者),当博客的状态发生变化时,通过Notify成员函数通知所有的观察者,告诉他们博客的状态更新了。而观察者通过Update成员函数获取博客的状态信息。代码实现不难,下面给出C++的一种实现。

  1. //观察者  
  2. class Observer    
  3. {  
  4. public:  
  5.     Observer() {}  
  6.     virtual ~Observer() {}  
  7.     virtual void Update() {}   
  8. };  
  9. //博客  
  10. class Blog    
  11. {  
  12. public:  
  13.     Blog() {}  
  14.     virtual ~Blog() {}  
  15.     void Attach(Observer *observer) { m_observers.push_back(observer); }     //添加观察者  
  16.     void Remove(Observer *observer) { m_observers.remove(observer); }        //移除观察者  
  17.     void Notify() //通知观察者  
  18.     {  
  19.         list<Observer*>::iterator iter = m_observers.begin();  
  20.         for(; iter != m_observers.end(); iter++)  
  21.             (*iter)->Update();  
  22.     }  
  23.     virtual void SetStatus(string s) { m_status = s; } //设置状态  
  24.     virtual string GetStatus() { return m_status; }    //获得状态  
  25. private:  
  26.     list<Observer* > m_observers; //观察者链表  
  27. protected:  
  28.     string m_status; //状态  
  29. };  

      以上是观察者和博客的基类,定义了通用接口。博客类主要完成观察者的添加、移除、通知操作,设置和获得状态仅仅是一个默认实现。下面给出它们相应的子类实现。     

  1. //具体博客类  
  2. class BlogCSDN : public Blog  
  3. {  
  4. private:  
  5.     string m_name; //博主名称  

抱歉!评论已关闭.