青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

設計模式之觀察者模式

一、什么是觀察者模式

     Observer模式也叫觀察者模式,是由GoF提出的23種軟件設計模式的一種。Observer模式是行為模式之一,它的作用是當一個對象的狀態發生變化時,能夠自動通知其他關聯對象,自動刷新對象狀態。

  觀察者模式(Observer)完美的將觀察者和被觀察的對象分離開。舉個例子,用戶界面可以作為一個觀察者,業務數據是被觀察者,用戶界面觀察業務數據的變化,發現數據變化后,就顯示在界面上。面向對象設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。

 

  觀察者模式有很多實現方式,從根本上說,該模式必須包含兩個角色:觀察者和被觀察對象。在剛才的例子中,業務數據是被觀察對象,用戶界面是觀察者。觀察者和被觀察者之間存在“觀察”的邏輯關聯,當被觀察者發生改變的時候,觀察者就會觀察到這樣的變化,并且做出相應的響應。如果在用戶界面、業務數據之間使用這樣的觀察過程,可以確保界面和數據之間劃清界限,假定應用程序的需求發生變化,需要修改界面的表現,只需要重新構建一個用戶界面,業務數據不需要發生變化。

 

  “觀察”不是“直接調用”

  實現觀察者模式的時候要注意,觀察者和被觀察對象之間的互動關系不能體現成類之間的直接調用,否則就將使觀察者和被觀察對象之間緊密的耦合起來,從根本上違反面向對象的設計的原則。無論是觀察者“觀察”觀察對象,還是被觀察者將自己的改變“通知”觀察者,都不應該直接調用。

 

  實現觀察者模式的形式

  實現觀察者模式有很多形式,比較直觀的一種是使用一種“注冊——通知——撤銷注冊”的形式。

 

   實現觀察者模式例子

       下面是C++的實現,在C++實現中,C++中沒有接口的概念,但是可以用抽象類類代替Java或C#中的接口,在C++中抽象類中從派生類中抽象出來的函數(方法),必須定義成純虛函數,這樣在后面的使用中才可以通過基類的指針來訪問這些函數,面向對象的語言中有個特點,多態只能訪問兩者中共有的部分。

  1
  2#include "stdafx.h"
  3#include <string>
  4#include <vector>
  5#include<list>
  6#include<iostream>
  7using namespace std;
  8
  9class Observer;
 10class Subject
 11{
 12public:
 13    //注冊
 14     virtual void attach(Observer *o)=0;
 15     //撤銷
 16     virtual void dettach(Observer *o)=0;
 17     //發送消息,更新觀察者數據
 18     virtual void change()=0;
 19     //更新數據
 20     virtual void setWeather(string str)=0;
 21     //獲取數據
 22     virtual string getWeather()=0;
 23}
;
 24
 25class Observer
 26{
 27public:
 28    //獲得觀察者的名字,用于后面dettach撤銷操作
 29     virtual string getName()=0;
 30     //更新數據,用于被觀察者調用
 31     virtual void update(Subject *s)=0;
 32}
;
 33
 34//被觀察者
 35class Earth: public Subject
 36{
 37private:
 38    //數據
 39     string weather;
 40     //存放觀察者的list,因為Observer是個抽象類,
 41     //所以不能聲明成 list<Observer >* l
 42     list<Observer* >* l;//指針 
 43public:
 44    //初始化存放觀察者的容器
 45     Earth()
 46     {
 47        l = new list<Observer*>;
 48     }
;
 49     //別忘了釋放資源
 50    ~Earth()
 51    {
 52        delete l;
 53    }
;
 54    //注冊觀察者
 55     void attach(Observer *o)
 56     {
 57        this->l->push_back(o);
 58     }
;
 59    
 60     //注銷觀察者
 61      void dettach(Observer *o)
 62     {
 63         for(list<Observer*>::iterator it=l->begin();it!=l->end();++it)
 64         {
 65             //通過string來進行查找,其他通過指針怎么判斷相等比較困難
 66             if( (*it)->getName() == o->getName())
 67             {
 68                 l->remove(*it);
 69                 break;
 70             }

 71         }

 72     }
;
 73
 74    //通知并更新觀察者
 75     void change()
 76     {
 77          for(list<Observer*>::iterator it=l->begin();it!=l->end();++it)
 78          {
 79            (*it)->update(this);
 80          }

 81     }
;
 82
 83     //更新數據
 84     void setWeather(string str)
 85     {
 86          this->weather=str;
 87          change();
 88     }
;
 89
 90     string getWeather()
 91     {
 92         return this->weather;
 93     }
;
 94
 95}
;
 96
 97class Satellite:public Observer
 98{
 99private:
100     string name;
101public:
102     Satellite(string str)
103     {
104          name=str;
105     }

106     string getName()
107     {
108         return name;
109     }
;
110     //更新數據
111     void update(Subject *s)
112     {
113         cout<<this->getName()+" "+s->getWeather()<<endl;
114     }

115}
;
116
117
118
119int _tmain(int argc, _TCHAR* argv[])
120{
121     Earth e;
122     Satellite *s1 = new Satellite("風云一號");
123     Satellite *s2 = new Satellite("風云二號");
124     Satellite *s3 = new Satellite("風云三號");
125     Satellite *s4 = new Satellite("風云四號");
126     e.attach(s1);
127     e.attach(s2);
128     e.attach(s3);
129     e.attach(s4);
130     e.setWeather("fine");
131     e.setWeather("rain");
132     //注銷s3
133     e.dettach(s3);
134     e.setWeather("fine");
135     e.setWeather("rain");
136
137
138    return 0;
139}

140
141

以上文字參照http://blog.csdn.net/preciousboy/article/details/6230467,對其代碼進行修改在vs2008中編譯調試通過。
結果運行為:


這里要注意的幾個問題是?
1.被觀察者怎么去通知觀察者數據已經更新?--本例子中是通過void change()函數來實現的;
2.在此模式中你可以從被觀察者處push或者pull數據,我們認為push的方式是正確的。
3.觀察者模式定義了一對多的關系
4.有多個觀察者時不依賴于特定的通知次序。
5.java的MVC模式就采用此模式實現。

posted on 2012-05-01 11:47 sheng 閱讀(656) 評論(0)  編輯 收藏 引用

導航

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統計

常用鏈接

留言簿(1)

隨筆檔案

收藏夾

同行

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品成人一区| 亚洲综合电影一区二区三区| 欧美亚洲系列| 国产老女人精品毛片久久| 久久本道综合色狠狠五月| 亚洲欧美在线一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 免费毛片一区二区三区久久久| 久久久久一区二区| 亚洲精品午夜| 亚洲免费视频在线观看| 国产视频在线观看一区二区| 免费黄网站欧美| 欧美色综合网| 巨胸喷奶水www久久久免费动漫| 久久综合色播五月| 这里只有精品电影| 久久精品亚洲热| 亚洲伦伦在线| 篠田优中文在线播放第一区| 亚洲精品国精品久久99热一| 亚洲综合国产激情另类一区| 亚洲高清久久久| 一本色道久久综合亚洲91| 国产嫩草一区二区三区在线观看| 免费不卡欧美自拍视频| 欧美视频在线观看免费| 六十路精品视频| 欧美午夜精品久久久久久久| 美女黄毛**国产精品啪啪| 欧美色精品天天在线观看视频| 久久夜色精品国产欧美乱| 欧美日韩亚洲精品内裤| 蜜桃久久av一区| 国产精品亚洲综合色区韩国| 亚洲人成网站色ww在线| 韩国av一区二区三区在线观看| 亚洲精品一区二区三| 激情久久影院| 午夜精品视频| 亚洲嫩草精品久久| 欧美精品少妇一区二区三区| 噜噜噜久久亚洲精品国产品小说| 欧美日韩国产欧| 欧美激情第二页| 黄色欧美日韩| 性欧美大战久久久久久久久| 亚洲欧美日韩精品久久久久| 欧美日韩国产精品专区| 亚洲电影免费观看高清完整版在线观看| 国产精品一区二区三区四区五区| 日韩一级视频免费观看在线| 亚洲九九精品| 欧美成人在线免费观看| 欧美成人激情在线| 一区久久精品| 久久久久久伊人| 免费日韩成人| 亚洲国产成人精品久久| 久久综合色88| 欧美激情一区二区三级高清视频| 亚洲大片免费看| 久久夜色精品亚洲噜噜国产mv| 看片网站欧美日韩| 国产欧美日韩综合一区在线观看 | 午夜精品福利一区二区蜜股av| 一级日韩一区在线观看| 欧美激情免费在线| 亚洲精品日本| 亚洲一区二区在线免费观看视频| 欧美日韩亚洲一区二区三区在线| 最新热久久免费视频| 国产精品99久久久久久久女警| 欧美日韩在线看| 亚洲一二区在线| 欧美主播一区二区三区美女 久久精品人| 国产精品久久久久久久电影| 亚洲欧美日本国产有色| 久久精品成人一区二区三区| 激情成人亚洲| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲一区自拍| 国产麻豆91精品| 久久精品日韩欧美| 欧美激情网友自拍| 亚洲一区二区三区高清不卡| 国产婷婷色一区二区三区在线| 久久久.com| 亚洲伦理在线观看| 久久福利一区| 亚洲精品久久7777| 国产精品老牛| 久久亚洲精品网站| 艳女tv在线观看国产一区| 久久本道综合色狠狠五月| 亚洲国产视频一区二区| 国产精品久久久久久久第一福利 | 99这里只有精品| 久久久久亚洲综合| 一本久久综合亚洲鲁鲁五月天| 国产精品一区二区久久| 欧美.www| 欧美一级在线播放| 亚洲精品久久视频| 久久久久久精| 亚洲天堂久久| 亚洲国产国产亚洲一二三| 国产精品黄色| 欧美国产精品v| 欧美综合国产| 亚洲网站在线播放| 最新国产成人av网站网址麻豆| 久久精品国产精品| 亚洲午夜精品17c| 亚洲日本久久| 亚洲电影观看| 狠狠久久亚洲欧美专区| 国产精品久久久久久久久久妞妞 | 欧美精品一区三区| 久久久久五月天| 午夜在线一区| 亚洲一区影院| 一区二区三区高清不卡| 亚洲东热激情| 欧美成人亚洲成人日韩成人| 欧美综合第一页| 亚洲制服av| 制服丝袜亚洲播放| 久久久美女艺术照精彩视频福利播放 | 久久精品噜噜噜成人av农村| 亚洲视频电影在线| 亚洲高清在线观看一区| 免费成人小视频| 久久久av毛片精品| 欧美在线啊v| 亚洲欧美日韩在线高清直播| 在线一区二区三区做爰视频网站| 亚洲美女中出| 一区二区三区国产| 一区二区三区四区在线| 亚洲图片在线| 亚洲一区二区在线看| 亚洲主播在线观看| 午夜电影亚洲| 欧美一区二区三区在| 性久久久久久久久久久久| 午夜久久久久| 久久野战av| 欧美电影在线| 亚洲区第一页| 一区二区三区四区国产精品| 亚洲天堂黄色| 欧美在线地址| 久久夜色精品亚洲噜噜国产mv| 久久综合久久综合这里只有精品 | 国产欧美韩日| 黑人巨大精品欧美黑白配亚洲| 伊人久久大香线| 亚洲日本在线观看| 亚洲午夜久久久久久久久电影院 | 亚洲日本成人女熟在线观看| 99国内精品| 欧美一区二区精品| 快射av在线播放一区| 欧美日韩大片| 国产亚洲成av人片在线观看桃| 有坂深雪在线一区| 99国内精品久久久久久久软件| 亚洲欧美日韩国产成人| 久久亚洲精品一区| 91久久久精品| 欧美一区二区三区的| 欧美福利一区二区| 国产乱码精品一区二区三| 亚洲第一在线综合网站| 亚洲欧美www| 欧美r片在线| 亚洲香蕉成视频在线观看| 可以免费看不卡的av网站| 国产精品国产三级国产aⅴ入口| 狠狠色综合网站久久久久久久| 亚洲国产三级网| 欧美一区二粉嫩精品国产一线天| 免费成人在线观看视频| 亚洲午夜久久久| 蜜臀a∨国产成人精品| 国产欧美日韩视频| 亚洲美女电影在线| 久久久精品国产免费观看同学| 亚洲精品久久久久久一区二区| 亚洲欧美视频一区二区三区| 欧美激情亚洲一区| 伊人久久亚洲影院| 午夜精品成人在线视频| 亚洲欧洲日产国产综合网| 久久女同互慰一区二区三区| 国产精品视频精品| 日韩系列在线| 欧美黑人在线观看| 久久久久国产一区二区三区四区|