[设计模式]中介者模式之Events消息传递实现
生活随笔
收集整理的這篇文章主要介紹了
[设计模式]中介者模式之Events消息传递实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這篇文章比較短,修改自 寫給大家看的設計模式之中介者中的例子
中介者模式的定義和目的自不必說, 參考上文即可. 本文針對實現(xiàn)方式做一個補充.
中介者模式增加了一個第三方對象(中介者)來控制兩個對象(同事)間的交互. 有助于對彼此通信的解耦, 畢竟他們并不需要關心對方的實現(xiàn)細節(jié).
例子中給出了ChatRoom作為第三方中介者, 而User作為真正的通信對象, 每個用戶發(fā)送的消息實際上是在ChatRoom中進行了廣播. 對于通信的接耦有兩種方式:
- User調用第三方對象的方法, 進行消息或者動作的傳遞, 比如上文中的實現(xiàn)即調用了ChatRoom的ShowMessage方法.
- 不同的對象不通過方法調用來交互, 而是通過消息總線傳遞消息體.
實現(xiàn)
這里針對第二點給出實現(xiàn), 這里利用boost::signal2來實現(xiàn)ChatRoom對消息體訂閱, 各User對象實例負責信息的發(fā)布.
#include <iostream> #include <string> #include <ctime> #include <iomanip> #include <boost/signals2/signal.hpp> using namespace std; using namespace boost::signals2;// Message struct EventMessage {virtual ~EventMessage() = default;virtual void showMessage() const = 0; }; struct ChatMessage : public EventMessage {string username;string message;ChatMessage(const string &username, const string &message) : username(username), message(message) {}void showMessage() const override {std::time_t now = std::time(nullptr);std::cout << std::put_time(std::localtime(&now), "%Y-%m-%d %H:%M:%S") << "[" << username << "]: " << message << std::endl;} };// EventBus -> ChatRoom struct EventBus {signal<void(EventMessage *)> sig;EventBus() {sig.connect([](EventMessage *e){ChatMessage *mess = dynamic_cast<ChatMessage *>(e);if(mess) {mess->showMessage();}});} };// instance struct User {string name_;EventBus &event;User(const string &name_, EventBus &event) : name_(name_), event(event) {}void send(const string &message) {ChatMessage chatMessage(name_, message);event.sig(&chatMessage);} };int main() {EventBus bus;User john("John Doe", bus);User jane("Jane Doe", bus);john.send("Hi, there!");jane.send("Hey!"); }優(yōu)點
當前的例子的業(yè)務模型實際比較簡單, 如果業(yè)務變的復雜(比如還要支持私信即可定點sendMessage新增廣播消息即每個用戶需要支持received), 如果繼續(xù)使用方法傳遞,那么ChatRoom為了和User通信,互相調用來調用去,很容易暈掉, 而只用通過訂閱事件進行的數(shù)據(jù)傳遞,數(shù)據(jù)生產者和使用者在注冊的時候就清晰明了,不容易出錯.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的[设计模式]中介者模式之Events消息传递实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java敏感词汇过滤工具类
- 下一篇: frontcon函数用不了_C++复制构