用C++跟你聊聊“中介者模式”

举报
看,未来 发表于 2020/12/30 00:20:02 2020/12/30
【摘要】 文章目录 大型相亲现场 *VS* 传统媒人模式中介者模式架构UML类图代码实现中介者模式优劣分析 大型相亲现场 VS 传统媒人模式 为啥用这个栗子,不解释了。 大型相亲现场是这样的: (圆的是女的,五角星是男的) 有没有发现这个图,耦合度极高。 好,现在哪两对互看不顺眼了,要换人,然后再换人,再换人,这个图越弄越乱了。 媒人相亲模式是这样的:...

在这里插入图片描述

大型相亲现场 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;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

中介者模式优劣分析

中介者模式很容易在系统中应用,当然,也很容易误用。
当系统中出现了“多对多”的集群现象时,先不要急着套上中介者模式,先分析清楚自己的系统设计是不是合理。

中介者模式站在一个更宏观的角度,将交互复杂性集中到了自己身上,这就使得中介者变得比每个同事类更复杂。

所以,双刃剑,而且是绝对锋利的双刃剑。

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/106207200

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。