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

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. plyr包使用

    #-------------------------------- # plyr包使用# 建议直接保存为R文件到Rstudio中运行 #-------------------------------- ...

  2. [R] 保存pheatmap图片对象到文件

    一般我们使用pheatmap通过Rstudio交互得到的图片在plots的Export导出即可,如何保存对象到文件呢?这个需求在自动化流程中很常见,作者似乎也没说明. 生成示例数据: test = m ...

  3. python-django-聚合与统计

    l例子1: 这里的values_list 相当于SQL语句里面的GROUP BY的功能,但是返回的是一个元组 要实现示例当中的直接用,与数据库格式有关将模型设计得更加完美 模型: 注意related_ ...

  4. python故障

    问题: ImportError: No module named dns.resolver 解决: 通过包管理工具pip安装dnspython pip install dnspython

  5. C++ STL算法之:copy

    C++ STL算法:copy 目录(?)[+] 前面十二个算法所展现的都属于非变易算法(Non-mutating algorithms)系列,现在我们来看看变易算法.所谓变易算法(Mutating a ...

  6. 1 — 第一个springboot

    1.什么是springboot? 老规矩:百度百科一下 2.对springboot快速上手 1).第一种方式:通过官网来创建springboot项目 ---- 了解即可 这里面的创建方式不做过多说明, ...

  7. C语言中的除法的计算

    不用除号,计算除法运算.思路是使用减法运算!思路1:循环采用减法每次减去n,直到做完减法之后结果小于0为止 但是这样次数较大  如求100/3,需要次数为34次. 思路2:循环采用减法每次减去k,K的 ...

  8. tensorboard No dashboards are active for the current data set.

    修改一下启动命令时的路径 位置示例: 命令为   E:\PYTHON_PROJECT\testTF\inceptionV1_net\log>tensorboard --logdir=TEC4FN ...

  9. MapReduce04 框架原理Shuffle

    目录 2 MapReduce工作流程 3 Shuffle机制(重点) 3.1 Shuffle机制 3.2 Partition分区 默认Partitioner分区 自定义Partitioner分区 自定 ...

  10. Java8 Lambda表达式、函数式接口和方法引用

    目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...