日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2023/12/10 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式C++实现 ——观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。它還有兩個別名,依賴(Dependents),發布-訂閱(Publish-Subsrcibe)??梢耘e個博客訂閱的例子,當博主發表新文章的時候,即博主狀態發生了改變,那些訂閱的讀者就會收到通知,然后進行相應的動作,比如去看文章,或者收藏起來。博主與讀者之間存在種一對多的依賴關系。下面給出相應的UML圖設計。


? ? ? ?可以看到博客類中有一個觀察者鏈表(即訂閱者),當博客的狀態發生變化時,通過Notify成員函數通知所有的觀察者,告訴他們博客的狀態更新了。而觀察者通過Update成員函數獲取博客的狀態信息。代碼實現不難,下面給出C++的一種實現。

[cpp]?view plaincopyprint?
  • //觀察者??
  • class?Observer????
  • {??
  • public:??
  • ????Observer()?{}??
  • ????virtual?~Observer()?{}??
  • ????virtual?void?Update()?{}???
  • };??
  • //博客??
  • class?Blog????
  • {??
  • public:??
  • ????Blog()?{}??
  • ????virtual?~Blog()?{}??
  • ????void?Attach(Observer?*observer)?{?m_observers.push_back(observer);?}?????//添加觀察者??
  • ????void?Remove(Observer?*observer)?{?m_observers.remove(observer);?}????????//移除觀察者??
  • ????void?Notify()?//通知觀察者??
  • ????{??
  • ????????list<Observer*>::iterator?iter?=?m_observers.begin();??
  • ????????for(;?iter?!=?m_observers.end();?iter++)??
  • ????????????(*iter)->Update();??
  • ????}??
  • ????virtual?void?SetStatus(string?s)?{?m_status?=?s;?}?//設置狀態??
  • ????virtual?string?GetStatus()?{?return?m_status;?}????//獲得狀態??
  • private:??
  • ????list<Observer*?>?m_observers;?//觀察者鏈表??
  • protected:??
  • ????string?m_status;?//狀態??
  • };??
  • ? ? ? 以上是觀察者和博客的基類,定義了通用接口。博客類主要完成觀察者的添加、移除、通知操作,設置和獲得狀態僅僅是一個默認實現。下面給出它們相應的子類實現。? ? ?

    [cpp]?view plaincopyprint?
  • //具體博客類??
  • class?BlogCSDN?:?public?Blog??
  • {??
  • private:??
  • ????string?m_name;?//博主名稱??
  • public:??
  • ????BlogCSDN(string?name):?m_name(name)?{}??
  • ????~BlogCSDN()?{}??
  • ????void?SetStatus(string?s)?{?m_status?=?"CSDN通知?:?"?+?m_name?+?s;?}?//具體設置狀態信息??
  • ????string?GetStatus()?{?return?m_status;?}??
  • };??
  • //具體觀察者??
  • 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()??//獲得更新狀態??
  • ????{???
  • ????????string?status?=?m_blog->GetStatus();??
  • ????????cout<<m_name<<"-------"<<status<<endl;??
  • ????}??
  • };??
  • ? ? ? 客戶的使用方式:

    [cpp]?view plaincopyprint?
  • //測試案例??
  • int?main()??
  • {??
  • ????Blog?*blog?=?new?BlogCSDN("wuzhekai1985");??
  • ????Observer?*observer1?=?new?ObserverBlog("tutupig",?blog);??
  • ????blog->Attach(observer1);??
  • ????blog->SetStatus("發表設計模式C++實現(15)——觀察者模式");??
  • ????blog->Notify();??
  • ????delete?blog;?delete?observer1;??
  • ????return?0;??
  • }??
  • ? ? ? 本人享有博客文章的版權,轉載請標明出處?http://blog.csdn.net/wuzhekai1985

    總結

    以上是生活随笔為你收集整理的设计模式C++实现 ——观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。