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、输出结果
c++设计模式概述之中介的更多相关文章
- 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- PHP设计模式概述
PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
随机推荐
- UOJ 266 - 【清华集训2016】Alice和Bob又在玩游戏(SG 定理+01-trie)
题面传送门 神仙题. 首先注意到此题的游戏是一个 ICG,故考虑使用 SG 定理解决这个题,显然我们只需对每个连通块计算一遍其 SG 值异或起来检验是否非零即可.注意到我们每删除一个点到根节点的路径后 ...
- Scrapy爬虫框架的安装和使用
Scrapy是一个十分强大的爬虫框架,依赖的库比较多,至少需要依赖的库有Twisted 14.0.lxml 3.4和pyOpenSSL 0.14.在不同的平台环境下,它所依赖的库也各不相同,所以在安装 ...
- idea安装插件 JClassLib Bytecode viewer
目录 idea安装插件 JClassLib Bytecode viewer 安装过程 使用 idea安装插件 JClassLib Bytecode viewer IDEA 中安装 jClassLib ...
- 一份不错的Java就业指导
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢? 本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些 ...
- 格式化代码(Eclipse 格式化代码块快捷键:Ctrl+Shift+F)
1.格式化java代码 : ①Ctrl+Shift+F 但是我们会遇到按 Ctrl+Shift+F不起作用的时候? Ctrl+Shift+F 在搜狗拼音里是简繁替换.一旦安装搜狗拼音这个快 ...
- BigDecimal 计算注意事项
BigDecimal 在进行除法运算(divide)时一定要注意:如果被除数为变量,一定要指定精度 和 舍入模式,否则会报:Non-terminating decimal expansion; no ...
- Linux 网卡配置文件,命令详细设置
1.配置文件/etc/hosts(本地主机ip地址映射,可以有多个别名)./etc/services(端口号与标准服务之间的对应关系)./etc/sysconfig/network(设置主机名,网关, ...
- 【Linux】【Shell】【Basic】文件查找locate,find
1.locate: 1.1. 简介:依赖于事先构建好的索引库: 系统自动实现(周期性任务): 手动更新数据库(updatedb): 1.2. 工作特性:查找速度快:模糊 ...
- I/O流之文件流
1.文件操作类 File 1.public File(String pathname)//给定一个要操作文件的完整路径 2.public File(File parent,String child)/ ...
- Mysql资料 存储索引