[設計モード]仲介者モードのEventsメッセージング実現
この文章は比較的に短くて、みんなに見た設計モードの仲介者の中の例の仲介者モードの定義と目的を修正するのは言うまでもなく、上述を参考にすればよい.本文は実現方式に対して一つの補充を行う.
仲介者モードは、2つのオブジェクト(同僚)間のインタラクションを制御するために、サードパーティオブジェクト(仲介者)を追加する.互いに通信するデカップリングに役立ち、結局、相手の実現の詳細に関心を持つ必要はない.
本例では、 の異なるオブジェクトは、メソッド呼び出しによって対話するのではなく、メッセージバスを介してメッセージボディを伝達する.
インプリメンテーション
ここでは、boost::signal 2を用いる
メリット
現在の例のビジネスモデルは実際には比較的簡単であり、ビジネスが複雑になった場合(例えば、私信をサポートするためにポイントsendMessageの新しいブロードキャストメッセージ、すなわち、各ユーザがreceivedをサポートする必要がある場合)、方法伝達を継続すると、
仲介者モードは、2つのオブジェクト(同僚)間のインタラクションを制御するために、サードパーティオブジェクト(仲介者)を追加する.互いに通信するデカップリングに役立ち、結局、相手の実現の詳細に関心を持つ必要はない.
本例では、
ChatRoom
を第三者仲介者として、User
を真の通信対象として、各ユーザが送信メッセージは、実際にはChatRoom
でブロードキャストされている.通信の結合には2つの方法があります.User
サードパーティのオブジェクトを呼び出す方法は、メッセージまたは動作の伝達を行い、例えば、上述の実装、すなわちChatRoom
を呼び出すShowMessage
方法である.インプリメンテーション
ここでは、boost::signal 2を用いる
ChatRoom
対のメッセージ体購読を実現し、各User
のオブジェクトインスタンスが情報の公開を担当する第2の点について説明する.#include
#include
#include
#include
#include
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 sig;
EventBus() {
sig.connect([](EventMessage *e){
ChatMessage *mess = dynamic_cast(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!");
}
メリット
現在の例のビジネスモデルは実際には比較的簡単であり、ビジネスが複雑になった場合(例えば、私信をサポートするためにポイントsendMessageの新しいブロードキャストメッセージ、すなわち、各ユーザがreceivedをサポートする必要がある場合)、方法伝達を継続すると、
ChatRoom
はUser
と通信するために互いに呼び出し合うために使用され、気絶しやすく、購読イベントによるデータ伝達のみを使用する.データ生産者と利用者は登録時にはっきりしていて、間違いにくい.