設計模式之後:觀察者模式知識點整理

1、什麼是觀察者模式?

觀察者模式定義一系列對象之間的一對多關係,當一個對象改變、更新狀態時,依賴它的都會收到通知改變或者更新。

觀察者模式是一種行爲型模式。

2、爲什麼需要觀察者模式?

從定義中我們可以知道觀察者模式當對象改變時,其他依賴的對象都會收到改變信息的狀態。

從本例分析項目經理想知道進度情況,他只需要綁定進度,他就可以知道進度信息了,而無需關心如何操作,如果再增加一個想知道進度信息老闆呢?也很容易,也讓老闆綁定進度信息數據就好了,不想知道的時候就解除綁定,就不在獲取進度信息了。

所以在本案例場景中,觀察者是我們這個場景非常合適的設計。

3、如何實現觀察者模式?

自定義觀察者模式

實現如下

我們先來看一下這個UML類圖進行分析

4.優點與缺點 

觀察者模式優點:
觀察者和被觀察者是抽象耦合的
察者模式實現了動態聯動
觀察者模式支持廣播通信
觀察者模式缺點:
如一個主題被大量觀察者註冊,則通知所有觀察者會花費較高代價
如果某些觀察者的響應方法被阻塞,整個通知過程即被阻塞,其它觀察者不能及時被通知

demo:

#include  <iostream>
#include  <vector>
#include  <string>
using namespace std;
class Secretary;
class Obersever{
public:
    Obersever(string name,Secretary* secretary):m_name(name),m_secretary(secretary){}
    void uptate(string action){
       cout<<"observer:"<<m_name<<",receive action:"<<action<<endl;
    }
private:
    string  m_name;
    Secretary* m_secretary;

};
//notify

class Secretary{
public:
    void addobserver(Obersever *o){
        v.push_back(o);
    }
    void Notify(string action)
    {
        for(vector<Obersever*>::iterator it=v.begin();it!=v.end();it++){
            (*it)->uptate(action);
        }
    }
    void setaction(string action)
    {
        m_action=action;
        Notify(m_action);
    }
private:
    string m_action;
    vector<Obersever*> v;
};
int main()
{
  //
  Secretary * s1=new Secretary;
  //notify object
  Obersever *po1=new Obersever("zhong",s1);
  s1->addobserver(po1);
  Obersever *po2=new Obersever("xian",s1);
  s1->addobserver(po2);
  s1->setaction("boss is coming");
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章