代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。

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、输出结果

c++设计模式概述之中介的更多相关文章

  1. 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...

  2. 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...

  3. OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

    一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...

  4. PHP设计模式概述

    PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  5. java设计模式概述

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...

  6. 23种GoF设计模式概述

    23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...

  7. Java设计模式(一):设计模式概述、UML图、设计原则

    1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  8. 设计模式(一)----设计模式概述及UML图解析

    1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  9. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

随机推荐

  1. 【百奥云GS专栏】1-全基因组选择介绍

    目录 什么是基因组选择? 基因组选择技术的发展 基因组选择的原理和流程 基因组选择的模型 基因组选择的展望 参考资料 什么是基因组选择? 基因组选择(Genomic Selection,简称GS)这一 ...

  2. composer设置阿里云镜像源

    composer设置阿里云镜像源 1. 首先把默认的源给禁用掉 composer config -g secure-http false 2. 再修改镜像源 这里我使用阿里的源 composer co ...

  3. MYSQL5.8----2

    一定要按照这个顺序,where group by having order by limit 可以进行一次排序之后再一次拍寻 #存储的时候,能存数字就村数字

  4. perl 多fasta文件匹配,并提取匹配文件第一条序列

    目标如题,有多个fasta文件和一个文件名列表,将文件名列表中包含的文件匹配出来并提取第一条序列合并成一个fa文件. 这个采用perl实现,用法和代码如下: 1 #!/usr/bin/perl -w ...

  5. 工作学习1-tcp自连接

    运维同事反馈服务起不来.下面为了方便,写了一个demo来展示. https://gitee.com/northeast_coder/code/tree/master/case/case1_tcp_se ...

  6. 【Redis】Sentinel 哨兵模式

    Sentinel(哨兵模式) 目录 Sentinel(哨兵模式) 哨兵模式的三个定时任务 Sentinel(哨兵)与Sentinel .主服务器.从服务器之间的连接 检测下线状态 选择领头 Senti ...

  7. Lottie 使用

    原文:https://mp.weixin.qq.com/s?__biz=MzIxNjc0ODExMA==&mid=2247485033&idx=1&sn=54dd477b4c4 ...

  8. JavaIO——内存操作流、打印流

    我们之前所做的都是对文件进行IO处理,实则我们也可以对内存进行IO处理.我们将发生在内存中的IO处理称为内存流. 内存操作流也可分为两类:字节内存流和字符内存流. (1)ByteArrayInputS ...

  9. SpringMVC原理分析

    Spring MVC主要包括以下要点: 1:由DispatcherServlet控制的整个流程: 2:注解驱动的控制器,其中包括请求映射.数据的绑定和格式化: 3:文件上传: 4:一些杂项,如静态资源 ...

  10. Mysql的行级锁

    我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的.所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的. Mysql有三种级别的锁定:表级锁 ...