前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我用过的设计模式(5)-- 中介者模式

我用过的设计模式(5)-- 中介者模式

原创
作者头像
看、未来
修改2021-02-26 10:14:28
5070
修改2021-02-26 10:14:28
举报
在这里插入图片描述
在这里插入图片描述

前言

什么是中介者模式呢?看上面那张图应该是一目了然了吧。

我在做FTP本地云小项目的后端建设时用了中介者模式,将几个大块的职责分布到不同的服务器中去。

在这里插入图片描述
在这里插入图片描述

我有写日报的好习惯,所以当时的事情是可以基本复现的。

具体在这篇:FTP文件管理项目(本地云)项目日报(五),细节可查。


中介者模式

又叫调停者模式,但是我更喜欢中介者这个名字,因为一下就表达出这个设计的意图了。

用一个中介对象封装一系列对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以改变他们之间的交互。

缺点

中介者负荷过高。

应用场景

用于一堆乱麻式的交互场景。中介者模式简单,但是也容易误用,不要为了使用中介者模式而使用它。

案例:大型相亲现场 VS 传统媒人模式

(圆的是女的,五角星是男的)

在这里插入图片描述
在这里插入图片描述

有没有发现这个图,耦合度极高。

好,现在哪两对互看不顺眼了,要换人,然后再换人,再换人,这个图越弄越乱了。

媒人相亲模式是这样的:

在这里插入图片描述
在这里插入图片描述

这样就实现了每对男男女女之间的解耦。有啥事儿跟中间人说一下,让中间人去解决。

但是这样中间人的责任就过大,是违背了单一职责原则。因为中间人就需要认识那么多人,你有办法?

中介者模式的优势就在于它的集中处理,但是缺点也在这里。

中介者模式类图

在这里插入图片描述
在这里插入图片描述

类图代码阐释

代码语言:txt
复制
#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;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 中介者模式
    • 缺点
      • 应用场景
      • 案例:大型相亲现场 VS 传统媒人模式
        • 中介者模式类图
          • 类图代码阐释
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档