[設計モード]仲介者モードのEventsメッセージング実現


この文章は比較的に短くて、みんなに見た設計モードの仲介者の中の例の仲介者モードの定義と目的を修正するのは言うまでもなく、上述を参考にすればよい.本文は実現方式に対して一つの補充を行う.
仲介者モードは、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をサポートする必要がある場合)、方法伝達を継続すると、ChatRoomUserと通信するために互いに呼び出し合うために使用され、気絶しやすく、購読イベントによるデータ伝達のみを使用する.データ生産者と利用者は登録時にはっきりしていて、間違いにくい.