/*<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/