BOOST::Signals2 / “觀察者模式” 趣味分析——Eric要參加劉德華的演唱會卻不知道時間,怎麼辦?

來源:互聯網
上載者:User

/*<br />Andy is going to hold a concert while the time is not decided.<br />Eric is a fans of Andy who doesn't want to miss this concert.<br />Andy doesn't know Eric.<br />How can Eric gets the news when Andy's concert is going to take?<br />*/<br />/*<br />Singer:被觀察者<br />Fans:觀察者<br />*/<br />#include "stdafx.h"<br />#include <iostream><br />#include <boost/signals2.hpp><br />#include <boost/bind.hpp><br />#include <string><br />using namespace std;<br />struct Singer<br />{<br />//定義訊號的類型,也就是說 Singer 需要知道 Fans 的回應程式式<br />//也就是說 Singer 需要知道 Fans 會採用什麼樣的方式來響應 Singer 所發出的訊號<br />//或者說 Singer 需要知道 Fans 用什麼樣的方式來接受 Singer 發出的訊號<br />//就相當於 Singer 需要知道 Fans的“郵箱”,到時候才可以將資訊投遞到 Fans 的“郵箱”類型中去<br />//Fans 的“郵箱”類型—— void (string time)<br />typedef boost::signals2::signal<void (string time)> signalType;<br />typedef signalType::slot_type slotType;<br />signalType m_signal; //定義一個訊號</p><p>//Singer 發布訊號<br />void PublishTime(string time)<br />{<br />m_signal(time); //將包含 time 資訊的訊號m_signal投遞到 Fans 的郵箱中去,注意,投遞之前這種類型的郵箱必須要和一個具體的Fans聯絡起來,即必須知道是誰擁有這種類型的郵箱,這一動作通過後邊的Subscribe實現。<br />}<br />//Singer 提供一種註冊渠道:Fans們可以通過這個渠道來進行註冊,告訴Singer,有新訊號的話就發送給我一個訊息<br />boost::signals2::connection Subscribe(const slotType& fans)<br />{//在這裡將Fans與Singer建立起一種聯絡(connection)<br />//到後面可以發現,Fans需要調用這個函數,即通過這個渠道告訴Singer有訊息就要通知給我<br />return m_signal.connect(fans);<br />}<br />};<br />struct Fans<br />{<br />// m_connection:聯絡的存在是在整個Fans的生命週期內的,一旦Fans消失,這種聯絡也就不複存在了<br />boost::signals2::scoped_connection m_connection;<br />//Fans的回應程式式,也就是Fans的郵箱類型,至於裡面具體做什麼事情,Singer不需要知道。<br />void Correspond(string time)<br />{<br />cout<<"I know the concert time: "<<time<<endl;<br />}<br />//Fans需要自己確定他要關注(觀察)哪一個Singer 的動向<br />void Watch(Singer& singer)<br />{<br />//通過調用Singer的Subscribe函數(渠道)來將自己的郵箱地址告知Singer<br />m_connection = singer.Subscribe(boost::bind(&Fans::Correspond, this, _1));<br />}<br />};<br />int main(int argc, char* argv[])<br />{<br />SingerAndy; //劉德華<br />FansEric; //Eric<br />Eric.Watch(Andy); //Eric告知劉德華:我要關注你的動向,請把你的最新資訊發給我<br />Andy.PublishTime("2010/10/01");//劉德華髮布最新資訊,一旦資訊發布,Eric的郵箱——void Correspond(string time)就會接受到資訊,並進行響應——cout<<….<br />return 0;<br />}<br /> 

 

Reference:

http://www.cppprog.com/boost_doc/doc/html/signals2/tutorial.html

http://www.cppprog.com/2009/0430/111.html

http://www.cppprog.com/boost_doc/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.