中介设计模式
中介模式想象一个场景:有n个人在一起聊天如果其中一个人发信息了其它人要收到信息。那么如何将n个人相互连接一起呢最简单的做法就是一个人与其它n-1个人保持联系那么将会有n(n-1)个关系复杂无比。那么接下来就是引入中介模式了。中介模式好比一台交换机只要所有用户和它连接就可以通过这台交换机来转播信息。那它需要什么方法呢首先想到的就是发送信息方法。其次它怎么知道有哪些用户连接它所以它还有一个注册用户的方法// 抽象中介 class Mediator{ public: virtual void registerUser(User* user) 0; virtual void sendMessage(const std::string mes,User* sender) 0; virtual ~Mediator() default; };那么再想一下这个virtual void sendMessage(const std::string mes,User* sender) 0;这个方法是给客户端用的吗很明显第二个参数是User如果是给客户端调用岂不是要记住所有用户这是不现实的。那么可以让用户类去引用这个中介在用户类中调用中介的sendMessage放法那么消息的发送者不就是this了所以用户需要暴露一个send方法给客户端使用// 抽象用户 class User{ protected: Mediator* _mediator; // 持有中介引用 std::string _name; public: User(const std::string name):_name(name),_mediator(nullptr){} virtual ~User() default; void setMediator(Mediator* m){ _mediator m; } virtual void send(const std::string msg) 0; virtual void receive(const std::string msg) 0; std::string getName()const{ return _name; } };Code接下来演示一个聊天室的中介设计模式class User; // 抽象中介 class Mediator{ public: virtual void registerUser(User* user) 0; virtual void sendMessage(const std::string mes,User* sender) 0; virtual ~Mediator() default; }; // 抽象同事 class User{ protected: Mediator* _mediator; // 持有中介引用 std::string _name; public: User(const std::string name):_name(name),_mediator(nullptr){} virtual ~User() default; void setMediator(Mediator* m){ _mediator m; } virtual void send(const std::string msg) 0; virtual void receive(const std::string msg) 0; std::string getName()const{ return _name; } }; // 具体中介 class ChatRoom:public Mediator{ public: void registerUser(User* user) override{ users.push_back(user); user-setMediator(this); // 绑定中介 } void sendMessage(const std::string msg,User* sender) override{ for(const auto user:users){ if(user!sender){ user-receive(msg); } } } ~ChatRoom() default; // 由客户端管理用户内存 private: std::vectorUser* users; }; // 具体同事类 class ChatUser:public User{ public: ChatUser(const std::string name):User(name){} void send(const std::string msg) override{ std::cout 【 _name 】发送 msg std::endl; if(_mediator){ _mediator-sendMessage(msg,this); } } void receive(const std::string msg) override{ std::cout 【 _name 】收到 msg std::endl; } ~ChatUser() default; }; signed main() { Mediator* chatRoom new ChatRoom; User* alice new ChatUser(Alice); User* bob new ChatUser(Bob); User* charlie new ChatUser(Charlie); chatRoom-registerUser(alice); chatRoom-registerUser(bob); chatRoom-registerUser(charlie); alice-send(大家好我是Alice); std::cout ------------------------ std::endl; bob-send(Hi Alice欢迎加入聊天室); return 0; }