前言
什么是中介者模式呢?看上面那张图应该是一目了然了吧。
我在做FTP本地云小项目的后端建设时用了中介者模式,将几个大块的职责分布到不同的服务器中去。
我有写日报的好习惯,所以当时的事情是可以基本复现的。
具体在这篇:FTP文件管理项目(本地云)项目日报(五),细节可查。
中介者模式
又叫调停者模式,但是我更喜欢中介者这个名字,因为一下就表达出这个设计的意图了。
用一个中介对象封装一系列对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以改变他们之间的交互。
缺点
中介者负荷过高。
应用场景
用于一堆乱麻式的交互场景。中介者模式简单,但是也容易误用,不要为了使用中介者模式而使用它。
案例:大型相亲现场 VS 传统媒人模式
(圆的是女的,五角星是男的)
有没有发现这个图,耦合度极高。
好,现在哪两对互看不顺眼了,要换人,然后再换人,再换人,这个图越弄越乱了。
媒人相亲模式是这样的:
这样就实现了每对男男女女之间的解耦。有啥事儿跟中间人说一下,让中间人去解决。
但是这样中间人的责任就过大,是违背了单一职责原则。因为中间人就需要认识那么多人,你有办法?
中介者模式的优势就在于它的集中处理,但是缺点也在这里。
中介者模式类图
类图代码阐释
#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
文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。
原文链接:lion-wu.blog.csdn.net/article/details/113763456