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

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. NECAT组装ONT long reads

    NECAT 可用于ONT数据的纠错,组装,如果想对ONT long reads进行call SV,也可以使用necatsv. githup网址:https://github.com/xiaochuan ...

  2. KEGG数据库整理示例

    已知KEGG数据库中ko_map.tab文件,K-->ko: 目标文件:map-->K 代码示例: #! /usr/bin/perl -w use strict; my %seq; ope ...

  3. R语言与医学统计图形-【33】生存曲线、森林图、曼哈顿图

    1.生存曲线 基础包survival+扩展包survminer. survival包内置肺癌数据集lung. library(survival) library(survminer) str(lung ...

  4. lilo.conf

    描述 默认情况下,本文件 ( /etc/lilo.conf ) 由引导管理程序 lilo 读取 (参考 lilo(8)). 它看起来可能象这样: boot = /dev/hda delay = 40 ...

  5. EXCEL-排名前三名显示小红旗,后三名显示小黑旗

    总结(用的WPS):第一步:用=IF(RANK(数值,引用范围) <=3,"小红旗",IF(RANK(数值,引用,1) <=3,"小黑旗",&quo ...

  6. 微信小程序扫描普通二维码打开小程序的方法

    很久没有写博客了,之前换了一份工作,很久没有做Android开发了,现在转做前端开发了,记录一下遇到的问题及解决的方法. 最近做微信小程序开发,遇到一个需求,后台管理系统生成的问卷和投票会有一个二维码 ...

  7. jmeter+ant输出测试报告

    jmeter自己本身可以输出html测试报告的,不过这种自带的测试报告特别简陋,如下图所示,一般我们是不看这种的. 我们可以使用ant来输出更高效.更直观的测试报告. 首先下载安装ant, 我用的是a ...

  8. ceph块存储场景

    1.创建rbd使用的存储池. admin节点需要安装ceph才能使用该命令,如果没有,也可以切换到ceph-node1节点去操作. [cephfsd@ceph-admin ceph]$ ceph os ...

  9. 大数据学习day11------hbase_day01----1. zk的监控机制,2动态感知服务上下线案例 3.HDFS-HA的高可用基本的工作原理 4. HDFS-HA的配置详解 5. HBASE(简介,安装,shell客户端,java客户端)

    1. ZK的监控机制 1.1 监听数据的变化  (1)监听一次 public class ChangeDataWacher { public static void main(String[] arg ...

  10. Qt——error之undefined reference to `vtable for classname

    可能原因:自定义类中使用自定义槽和信号,但是没有在类中增加Q_OBJECT, 解决办法:在类中增加Q_OBJECT,删除编译产生的文件进行重新编译 具体原因分析如下 博主原文