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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

观察者模式与Boost.Signals

發(fā)布時(shí)間:2023/12/10 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 观察者模式与Boost.Signals 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1)? 觀察者模式定義

略,各種設(shè)計(jì)模式的書(shū)上都有定義。

?

2)? 觀察者模式一般實(shí)現(xiàn)

觀察者模式一般實(shí)現(xiàn),都是“被觀察者”保存一個(gè)“觀察者”的列表,循環(huán)這個(gè)列表來(lái)通知“觀察者”。代碼,其中使用了boost的智能指針shared_ptr:

?

[cpp]?view plaincopy
  • #include?<iostream>??
  • #include?<list>??
  • #include?"boost/shared_ptr.hpp"??
  • using?namespace?std;??
  • using?namespace?boost;??
  • ??
  • //觀察者基類??
  • class?Observer??
  • {??
  • public:??
  • ????//處理被觀察者的通知??
  • ????virtual?void?update(const?int?i)?=?0;??
  • };??
  • ??
  • //觀察者類A??
  • class?ObserverA?:?public?Observer??
  • {??
  • public:??
  • ????virtual?void?update(const?int?i)??
  • ????{??
  • ????????cout?<<?"ObserverA.update("?<<?i?<<?")"?<<?endl;??
  • ????}??
  • };??
  • ??
  • //觀察者類B??
  • class?ObserverB?:?public?Observer??
  • {??
  • public:??
  • ????virtual?void?update(const?int?i)??
  • ????{??
  • ????????cout?<<?"ObserverB.update("?<<?i?<<?")"?<<?endl;??
  • ????}??
  • };??
  • ??
  • //被觀察者基類??
  • class?Subject??
  • {??
  • public:??
  • ????virtual?~Subject()??
  • ????{??
  • ??
  • ????}??
  • ????//注冊(cè)觀察者??
  • ????virtual?void?reg(const?shared_ptr<Observer>&?pObs)?=?0;??
  • ????//取消注冊(cè)觀察者??
  • ????virtual?void?unreg(const?shared_ptr<Observer>&?pObs)?=?0;??
  • ????//通知觀察者??
  • ????virtual?void?notify(const?int?i)?=?0;??
  • };??
  • ??
  • //被觀察者類A??
  • class?SubjectA?:?public?Subject??
  • {??
  • public:??
  • ????virtual?void?reg(const?shared_ptr<Observer>&?pObs)??
  • ????{??
  • ????????m_lstObs.push_back(pObs);??
  • ????}??
  • ????virtual?void?unreg(const?shared_ptr<Observer>&?pObs)??
  • ????{??
  • ????????for?(list<shared_ptr<Observer>?>::iterator?it?=?m_lstObs.begin();??
  • ????????????it?!=?m_lstObs.end();)??
  • ????????{??
  • ????????????if?(pObs?==?*it)?m_lstObs.erase(it++);??
  • ????????????else?++it;??
  • ????????}??
  • ????}??
  • ????virtual?void?notify(const?int?i)??
  • ????{??
  • ????????for?(list<shared_ptr<Observer>?>::iterator?it?=?m_lstObs.begin();??
  • ????????????it?!=?m_lstObs.end();?++it)??
  • ????????{??
  • ????????????(*it)->update(i);??
  • ????????}??
  • ????}??
  • protected:??
  • ????//觀察者類別??
  • ????list<shared_ptr<Observer>?>?m_lstObs;??
  • };??
  • ??
  • int?main()??
  • {??
  • ????//被觀察者pSubA??
  • ????shared_ptr<Subject>?pSubA(new?SubjectA);??
  • ????//觀察者pObsA??
  • ????shared_ptr<Observer>?pObsA(new?ObserverA);??
  • ????//觀察者pObsB??
  • ????shared_ptr<Observer>?pObsB(new?ObserverB);??
  • ????//注冊(cè)pObsA??
  • ????pSubA->reg(pObsA);??
  • ????//注冊(cè)pObsB??
  • ????pSubA->reg(pObsB);??
  • ????//通知??
  • ????pSubA->notify(1);????????????????//顯示??
  • ????????????????????????????????????//ObserverA.update(1)??
  • ????????????????????????????????????//ObserverB.update(1)??
  • ????//取消pObsA的注冊(cè)??
  • ????pSubA->unreg(pObsA);??
  • ????//通知??
  • ????pSubA->notify(2);????????????????//顯示??
  • ????????????????????????????????????//ObserverB.update(2)??
  • ????return?0;??
  • }??
  • ?

    ?

    3)? 觀察者模式Boost.Signals實(shí)現(xiàn)

    Boost.Signals是基于函數(shù)指針或函數(shù)對(duì)象來(lái)實(shí)現(xiàn)觀察者模式的。其中Boost.Signals2是線程安全版本。代碼:

    ?

    [cpp]?view plaincopy
  • #include?<iostream>??
  • #include?<list>??
  • #include?"boost/shared_ptr.hpp"??
  • #include?"boost/signal.hpp"??
  • using?namespace?std;??
  • using?namespace?boost;??
  • ??
  • //使用函數(shù)對(duì)象來(lái)實(shí)現(xiàn)??
  • //觀察者類A??
  • class?ObserverA??
  • {??
  • public:??
  • ????void?operator()(const?int?i)??
  • ????{??
  • ????????cout?<<?"ObserverA("?<<?i?<<?")"?<<?endl;??
  • ????}??
  • };??
  • ??
  • //觀察者類B??
  • class?ObserverB??
  • {??
  • public:??
  • ????void?operator()(const?int?i)??
  • ????{??
  • ????????cout?<<?"ObserverB("?<<?i?<<?")"?<<?endl;??
  • ????}??
  • };??
  • ??
  • int?main()??
  • {??
  • ????//被觀察者sig??
  • ????signal<void?(const?int)>?sig;??
  • ????//注冊(cè)觀察者ObserverA??
  • ????signals::connection?connA?=?sig.connect(ObserverA());??
  • ????//注冊(cè)觀察者ObserverB??
  • ????sig.connect(ObserverB());??
  • ??
  • ????//通知??
  • ????sig(1);?????????????????//顯示??
  • ????????????????????????????//ObserverA(1)??
  • ????????????????????????????//ObserverB(1)??
  • ????//取消obsA的注冊(cè)??
  • ????connA.disconnect();??
  • ????//通知??
  • ????sig(2);?????????????????//顯示??
  • ????????????????????????????//ObserverB(2)??
  • ????return?0;??
  • }??
  • ?

    Boost.Signals還支持被觀察者分組,可以對(duì)整個(gè)組進(jìn)行“通知”、取消注冊(cè)。另外,Boost.Signals需要編譯才能使用。

    轉(zhuǎn)載于:https://www.cnblogs.com/lvdongjie/p/4452056.html

    總結(jié)

    以上是生活随笔為你收集整理的观察者模式与Boost.Signals的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。