用C++跟你聊聊“中介者模式”
时间:2022-07-23
本文章向大家介绍用C++跟你聊聊“中介者模式”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
大型相亲现场 VS 传统媒人模式
为啥用这个栗子,不解释了。 大型相亲现场是这样的:
(圆的是女的,五角星是男的)
有没有发现这个图,耦合度极高。
好,现在哪两对互看不顺眼了,要换人,然后再换人,再换人,这个图越弄越乱了。
媒人相亲模式是这样的:
这样就实现了每对男男女女之间的解耦。有啥事儿跟中间人说一下,让中间人去解决。
但是这样中间人的责任就过大,是违背了单一职责原则。因为中间人就需要认识那么多人,你有办法?
中介者模式的优势就在于它的集中处理,但是缺点也在这里。
中介者模式架构
UML类图代码实现
#include<iostream>
using namespace std;
class Mediator; //定义一个类,但是不马上实现,这招我以前还真没试过。涨知识了
//因为下面两个类要互包
//抽象同事类
class Colleague {
protected :
Mediator *mediator;
public:
Colleague(Mediator* m) { mediator = m; }
virtual void Sent(string message) = 0;
};
//抽象中介者类
class Mediator {
public:
virtual void Send(string message, Colleague *colleague) = 0;
};
//具体同事类
class ConcreteColleague1 :public Colleague {
public:
ConcreteColleague1(Mediator* m) : Colleague(m) {}
void Sent(string message) { mediator->Send(message, this); }
void Notify(string message) { cout << "同事1得到消息:" << message << endl; }
};
class ConcreteColleague2 :public Colleague {
public:
ConcreteColleague2(Mediator* m) : Colleague(m) {}
void Sent(string message) { mediator->Send(message, this); }
void Notify(string message) { cout << "同事2得到消息:" << message << endl; }
};
//具体中介者类
class Concretemediator :public Mediator {
private:
ConcreteColleague1* colleague1;
ConcreteColleague2* colleague2;
public:
//无法将父类对象转化为子类对象,所以采用第二种方法
/*void SetColleague1(Colleague* pColleague){ colleague1 = pColleague; }
void SetColleague2(Colleague* pColleague){ colleague2 = pColleague; }*/
void SetColleague1(Colleague* pColleague){
colleague1 = dynamic_cast<ConcreteColleague1*>(pColleague);
}
void SetColleague2(Colleague * pColleague){
colleague2 = dynamic_cast<ConcreteColleague2*>(pColleague);
}
void Send(string message, Colleague* colleague){
if (colleague == colleague1)
colleague2->Notify(message);
else if (colleague == colleague2)
colleague1->Notify(message);
}
};
int main()
{
Concretemediator* mediator = new Concretemediator();
ConcreteColleague1* colleague1 = new ConcreteColleague1(mediator); //让他俩认识一下中介
ConcreteColleague2* colleague2 = new ConcreteColleague2(mediator);
mediator->SetColleague1(colleague1); //让中介认识一下他俩
mediator->SetColleague2(colleague2);
colleague1->Sent("有男朋友没?");
colleague2->Sent("有了");
return 0;
}
中介者模式优劣分析
中介者模式很容易在系统中应用,当然,也很容易误用。 当系统中出现了“多对多”的集群现象时,先不要急着套上中介者模式,先分析清楚自己的系统设计是不是合理。
中介者模式站在一个更宏观的角度,将交互复杂性集中到了自己身上,这就使得中介者变得比每个同事类更复杂。
所以,双刃剑,而且是绝对锋利的双刃剑。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Js递归
- scrollReveal实现网页重复动画效果
- ElementUI实现Upload文件上传服务器交互
- swiper.animate实现轮播展示动画效果
- 微信小程序子组件向父组件传值
- Css文字环绕圆形图片
- 微信小程序处理图片加载失败显示默认图片
- Dart环境配置和运行
- 微信小程序之间跳转及传参
- Spring源码学习笔记(2)——Bean的加载
- Css实现聊天框
- 机器学习之KNN原理与代码实现
- Dart常用的数据类型
- Vue版本更新清除浏览器缓存
- maven:Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenC