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

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. PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台

    ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...

  2. Python中类的相关介绍

    本文主要介绍python中类的概念性内容,如类的定义.说明及简单使用 1. 类的简单介绍 1 # -*- coding:utf-8 -*- 2 # Author:Wong Du 3 4 ''' 5 - ...

  3. ARM汇编基础指令

    Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...

  4. Pytorch学习笔记08----优化器算法Optimizer详解(SGD、Adam)

    1.优化器算法简述 首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD,这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度,这样的话自然就涉及到一个 trade-off,即参数更 ...

  5. 【Reverse】每日必逆0x00

    附件:https://files.buuoj.cn/files/aa4f6c7e8d5171d520b95420ee570e79/a9d22a0e-928d-4bb4-8525-e38c9481469 ...

  6. Spring标签库

    spring提供了两个标签库文件:spring-form.tld(表单标签库,用于输出HTML表单)  spring.tld(基础标签库,用于Spring数据绑定等) 使用步骤: 1,配置表单标签库, ...

  7. System.exit(-1)和return 的区别

    对于只有一个单一方法的类或者系统来说是一样的,但是对于含有多个类和方法,且调用关系比较复杂时就不一样了. System.exit(-1)是指所有程序(方法,类等)停止,系统停止运行. return只是 ...

  8. 基于spring sringmvc mybatis 做的导入导出

    导入 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...

  9. 【力扣】82. 删除排序链表中的重复元素 II

    存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序排列的结果链表. 示例 1: 输入:hea ...

  10. CentOS6设置开机自启动

    1.把开机启动脚本(mysqld)copy到文件夹/etc/init.d 或 /etc/rc.d/init.d 中 2.将启动程序的命令添加到 /etc/rc.d/rc.local 文件中,比如: # ...