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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[设计模式]中介者模式之Events消息传递实现

發(fā)布時間:2023/12/10 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [设计模式]中介者模式之Events消息传递实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章比較短,修改自 寫給大家看的設(shè)計(jì)模式之中介者中的例子
中介者模式的定義和目的自不必說, 參考上文即可. 本文針對實(shí)現(xiàn)方式做一個補(bǔ)充.

中介者模式增加了一個第三方對象(中介者)來控制兩個對象(同事)間的交互. 有助于對彼此通信的解耦, 畢竟他們并不需要關(guān)心對方的實(shí)現(xiàn)細(xì)節(jié).

例子中給出了ChatRoom作為第三方中介者, 而User作為真正的通信對象, 每個用戶發(fā)送的消息實(shí)際上是在ChatRoom中進(jìn)行了廣播. 對于通信的接耦有兩種方式:

  • User調(diào)用第三方對象的方法, 進(jìn)行消息或者動作的傳遞, 比如上文中的實(shí)現(xiàn)即調(diào)用了ChatRoom的ShowMessage方法.
  • 不同的對象不通過方法調(diào)用來交互, 而是通過消息總線傳遞消息體.

實(shí)現(xiàn)

這里針對第二點(diǎn)給出實(shí)現(xiàn), 這里利用boost::signal2來實(shí)現(xiàn)ChatRoom對消息體訂閱, 各User對象實(shí)例負(fù)責(zé)信息的發(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)點(diǎn)

當(dāng)前的例子的業(yè)務(wù)模型實(shí)際比較簡單, 如果業(yè)務(wù)變的復(fù)雜(比如還要支持私信即可定點(diǎn)sendMessage新增廣播消息即每個用戶需要支持received), 如果繼續(xù)使用方法傳遞,那么ChatRoom為了和User通信,互相調(diào)用來調(diào)用去,很容易暈掉, 而只用通過訂閱事件進(jìn)行的數(shù)據(jù)傳遞,數(shù)據(jù)生產(chǎn)者和使用者在注冊的時候就清晰明了,不容易出錯.

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的[设计模式]中介者模式之Events消息传递实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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