c++设计模式概述之中介
代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。
1、概述
A、中介模式,主要对象有两类: 中介和用户,类比生活中的房产中介公司,中介手中掌握着用户的资料,当然,用户手中也有中介的联系方式。
B、想象下,当中介收到用户的更新,会将消息转达给需要的用户手中。
C、还有,在线聊天,需要服务器和用户。 大家现在服务器注册,然后再登陆聊天,用户A发送消息,服务器收到,再将消息转发到目的地。
D、这样的模式和今天要概述的中介模式很相似。
E、下面以房产中介和用户为例。
2、抽象用户
// 抽象客户类 class oct_client { public: // 登记中介 virtual void set_medium(oct_medium* pinstance) { if (pinstance) _pmedium = pinstance; } virtual void send() = 0; virtual void recv() = 0; protected: // 中介公司 oct_medium *_pmedium = nullptr; };
3、抽象中介
// 抽象中介公司 class oct_medium { public: // 客户需要注册 virtual void set_down(oct_client *pinstance) = 0; // 当有变化时,即时通知客户 virtual void relay(oct_client* psrc) = 0; };
4、具体用户A
// 具体的客户 class oct_client_A : public oct_client { public: void send() { std::cout << "\n客户A发出请求\n"; // 请求发到中介手中,中介需要转发出去 if (_pmedium) _pmedium->relay(this); } void recv() { std::cout << "\n客户A收到中介转发的消息\n"; } };
5、具体用户B
// 客户B class oct_client_B : public oct_client { public: void send() { std::cout << "\n客户B发出请求\n"; // 请求发到中介手中,中介需要转发出去 if (_pmedium) _pmedium->relay(this); } void recv() { std::cout << "\n客户B收到中介转发的消息\n"; } };
6、具体中介公司
// 具体哪一家中介公司 class oct_medium_A : public oct_medium { public: // 将联系人的信息的登记到自己的小本子中 void set_down(oct_client *pinstance) { if (pinstance) { _list_client.push_back(pinstance); // 双向的,客户也需要知道中介的信息 pinstance->set_medium(this); } } // 中介转发,发给客户 void relay(oct_client* psrc) { if (!psrc) { std::cout << "\n目标联系人为空,无法完成转发\n"; return; } for each(auto item in _list_client) { // 将收到的信息转发给其他用户 if (psrc != item) item->recv(); } } private: // 中介,中间人,手上有大把大把联系人信息 std::list<oct_client*> _list_client; };
7、调用示例
1 void call_medium() 2 { 3 // 创建客户和中介 4 std::unique_ptr<oct_client> pclientA(new(std::nothrow) oct_client_A); 5 std::unique_ptr<oct_client> pclientB(new(std::nothrow) oct_client_B); 6 std::unique_ptr<oct_medium> pmediumA(new(std::nothrow) oct_medium_A); 7 8 if (!pclientB || !pclientA || !pmediumA) 9 { 10 std::cout << "\n创建中介和客户失败\n"; 11 return; 12 } 13 // ------------------------------------------------------------------------------- 14 // 1、客户登记中介信息 15 pclientA->set_medium(pmediumA.get()); 16 pclientB->set_medium(pmediumA.get()); 17 18 // 中介登记客户信息 19 pmediumA->set_down(pclientA.get()); 20 pmediumA->set_down(pclientB.get()); 21 22 // 2、客户A请求中介转发 23 std::cout << "\n1、客户A请求中介转发\n"; 24 pclientA->send(); 25 26 // 3、客户B请求中介转发 27 std::cout << "\n\n\n\n--------------------------------\n\n2、客户B请求中介转发\n"; 28 pclientB->send(); 29 30 }
8、输出结果