多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > <C++ 實現設計模式> 觀察者模式

<C++ 實現設計模式> 觀察者模式

來源:程序員人生   發布時間:2014-11-07 08:30:31 閱讀次數:3447次

視察者模式,又稱發布--定閱,mvc模式等. 通俗點講,比如股票來講,很多人關注1支股票,派1個人去視察股票的情況,1有變化(視察),就通知所有的預定這個消息的人.  

而我們常見的mvc模式,v是指view-視圖,m指model-模型,有點類似視察者模式,模型中的數據,1有變化就通知相干聯的視圖. 這樣很方便地隔離開了模型和視圖.

這里使用的例子是關于博客的定閱. 博客屬于被視察的對象,定閱者屬于視察者. 定閱者先定閱(注冊)博客,博客1有更新,就會遍歷注冊表,給定閱者推送更新的博客.

自己畫UML圖,,,我是自己畫的,UML圖對寫程序確切很有幫助.  下面直接給出相應代碼:

observer.h:

#ifndef OBSERVER_H #define OBSERVER_H #include<string> #include "subject.h" using namespace std; class Blog; class BlogCSDN; class Observer { public: Observer() {} virtual ~Observer() {} virtual void Update() {} }; class ObserverBlog : public Observer { private: string m_name; //視察者名稱 Blog *m_blog; //視察的博客,以鏈表的情勢更好,可以視察多個博客 public: ObserverBlog(string name, Blog *blog): m_name(name), m_blog(blog) {} ~ObserverBlog() {} void Update(); }; #endif


observer.cpp

#include "observer.h" #include<iostream> using namespace std; void ObserverBlog::Update() { string status = m_blog->GetStatus(); cout << m_name << "-------" << status << endl; }


subject.h

#ifndef SUBJECT_H #define SUBJECT_H #include<list> #include "observer.h" using namespace std; class Observer; class Blog { private: list<Observer *> m_observers; //視察者列表 protected: string m_status; //狀態 public: Blog() {} virtual ~Blog() {} void Attach(Observer *observer); //添加視察者 void Remove(Observer *observer); //移除視察者 void Notify(); //通知視察者 virtual void SetStatus(string s); //設置狀態 virtual string GetStatus(); //取得狀態 }; class BlogCSDN : public Blog { private: string m_name; //博主名字 public: BlogCSDN(string name) : m_name(name) {} ~BlogCSDN() {} void SetStatus(string s); string GetStatus(); }; #endif


subject.cpp

#include "subject.h" void Blog::Attach(Observer *observer) { m_observers.push_back(observer); } void Blog::Remove(Observer *observer) { m_observers.remove(observer); } void Blog::Notify() { list<Observer *>::iterator iter = m_observers.begin(); for(; iter != m_observers.end(); iter++) { (*iter)->Update(); } } void Blog::SetStatus(string s) { m_status = s; } string Blog::GetStatus() { return m_status; } void BlogCSDN::SetStatus(string s) { m_status = "csdn通知: " +m_name + s; } string BlogCSDN::GetStatus() { return m_status; }


main.cpp

#include "observer.h" #include "subject.h" int main() { Blog *blog = new BlogCSDN("zy416548283"); Observer *observer = new ObserverBlog("tutupig", blog); blog->Attach(observer); blog->SetStatus("發表視察者模式實現的文章"); blog->Notify(); delete blog; delete observer; return 0; }


編譯運行:

zy@zyPc:~/code/Cplus/designPattern/observer$ ./a.out tutupig-------csdn通知: zy416548283發表***文章


如果自己寫程序遇到交叉援用的問題(頭文件相互援用,又調用了類中的方法之類的),可以參考帖子:點擊打開鏈接 ,也能夠看看我的發問:點擊打開鏈接

PS:

參考博客:點擊打開鏈接

參考書籍:<23種設計模式-C++> ,<易學設計模式>




生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 一二三四视频社区5在线高清视频 | 福利片一区 | 播放个毛片看看 | 日本成a人免费视频 | 日韩精品免费一级视频 | 亚洲 自拍 另类 制服在线 | 亚洲视频中文字幕在线 | 日本一区二区三区免费视频 | 欧美巨大xxxx做受中文字幕 | 亚州男人天堂 | 久久精品久久精品久久精品 | 日韩不卡一区二区三区 | 这里是九九伊人 | 国产午夜精品不卡观看 | 中国精品视频 | 精品久久国产 | 天堂亚洲网 | 色综合久久98天天综合 | 成人自拍视频在线 | 欧美妇色| 国产精品一国产精品 | 叼嘿视频在线免费观看 | 最新avhd101在线播放 | 国产激情在线观看完整流畅 | 天天综合久久久网 | 天天做天天爱天天综合网 | 久久久久嫩草影院精品 | 激情春色网 | 亚洲高清日韩精品第一区 | 欧美日本一级在线播放 | 欧美一级高清免费播放 | 免费在线成人网 | 亚洲视频一区在线观看 | 免费一级毛片在播放视频 | 欧美亚洲图区 | 欧美xxxx视频| 国产精品福利在线观看免费不卡 | 一级做a爰片性色毛片刺激 一级做a爰片性色毛片黄书 | 久久天天躁狠狠躁夜夜不卡 | 成人乱码一区二区三区四区 | 亚洲欧美日韩国产色另类 |