應用開發過程中經常會處理物件間通訊的問題,一般都是物件或介面的依賴和引用去實現物件間的通訊,這在一般情況下是沒問題的,但是如果相互通訊的物件很多,可能會造成物件間的引用關係像蜘蛛網一樣,這樣會導致物件關係很複雜,難以維護的問題,解決這個問題的乙個好方法是通過訊息匯流排去解耦物件間大量相互引用的緊耦合的關係。
設計思路:被通訊物件向訊息匯流排發布乙個主題,這個主題包含訊息主題、訊息型別和訊息處理函式,訊息主題標示某個特定的主題,訊息型別用來區分標示這個主題會響應某個特定的訊息,訊息處理函式用來響應該主題的某種訊息型別。通訊物件向訊息匯流排傳送某個特定主和某個特定訊息,匯流排就會根據訊息主題和訊息型別找到對應的訊息處理函式處理該請求。
由於用到了c++11的可變模板引數和lamda表示式,windows上編譯需要compiler nov 2012 ctp,linux需要gcc4.7以上。
具體**:
#pragma once#include#include
#include
#include
template
struct
impl;
template
struct impl
};template
<>
struct impl<>
};template
std::
string
type_name()
class
messagebus : boost::noncopyable
); m_map.insert(make_pair(getkey(strtopic), f));
}//向某個主題傳送訊息, 需要主題和訊息型別。訊息匯流排收到訊息後會找到並通知對應的訊息處理函式。
templatevoid sendreq(string
strtopic, args... args)
}//移除某個主題, 需要主題和訊息型別
templatevoid remove(string
strtopic)
private
:
//獲得訊息鍵值,通過某個主題和訊息型別可以確定觀察者
templatestring getkey(string&strtopic)
private
: boost::unordered_multimap
m_map;
};
測試**:
messagebus bus;mystruct st;
bus.attach
("bb", &st, &mystruct::test); //
註冊主題(topic、訊息型別、訊息處理函式)
bus.attach("
bb", &st, &mystruct::test2);
bus.sendreq
("bb",0,"
"); //
傳送訊息處理請求(主題和訊息型別)
bus.remove("
bb"); //
移除主題(主題和訊息型別)
測試結果:
更新版本,通過萬能的函式包裝器實現訊息匯流排,使得介面的呼叫更加通用和一致。
template void>class
messagebus : boost::noncopyable
; m_map.insert(std::make_pair(strkey + type_name < args...>(), std::move(fn)));
}//non-const member function
template
void attach(string strkey, r(c::*f)(dargs...), p &&p)
;m_map.insert(std::make_pair(strkey + type_name < args...>(), std::move(fn)));
}template
void attach(string strkey, r(c::*f)(dargs...) const, p &&p)
;m_map.insert(std::make_pair(strkey + type_name < args...>(), std::move(fn)));
}//廣播訊息,主題和引數可以確定乙個訊息, 所有的訊息接收者都將收到並處理該訊息
templatevoid sendreq(string
strtopic, args... args)
}//移除訊息
templatevoid remove(string
strtopic)
private
: std::multimap
m_map;
};
測試**:
structa
void
gtest()
void htest(int x) const
};void gg(int
x)void
gg1()
void
testmessagebus()
乙個通用的分頁儲存過程 原創
這是我專案中使用的乙個分頁儲存過程,具有很強的通用性。配合前台asp.net使用50萬條資料基本感不到延遲。資料庫為sqlserver2000。1.分頁儲存過程 原始碼 create procedure pagination str sql varchar 1000 執行的sql 不含order b...
(原創)乙個簡潔通用的呼叫DLL函式的幫助類
本次介紹一種呼叫dll函式的通用簡潔的方法,消除了原來呼叫方式的重複與繁瑣,使得我們呼叫dll函式的方式更加方便簡潔。用過dll的人會發現c 中呼叫dll中的函式有點繁瑣,呼叫過程是這樣的 在載入dll後還要定義乙個對應的函式指標型別,再呼叫getprocaddress獲取函式位址,再轉成函式指標,...
乙個通用的makefile(一)
最近在編寫android編譯系統時,需要遍歷每乙個目錄下每乙個資料夾下的makefile,網上的方法有些繁瑣 就直接貼上自己遍歷子目錄深度為1 for temporary 之後會繼續更新 下面是我的乙個簡單例項工程 資料夾目錄層次 獲取當前目錄下的子目錄名字 2 subdir shell ls l ...