(七)中介者模式-C++实现

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

中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含,成为朋友。

中介者模式中有四种角色:

(1)中介者:定义了用于同事之间通信的方法

(2)具体中介者:如果只有一个中介者,那么可以只有一个具体中介者,不需要抽象中介者。它包含具体同事的引用,实现他们之间的通信。

(3)同事:抽象类,规定一些方法

(4)具体同事:包含具体中介者的引用,一个具体同事需要和其他同事交互时,将自己的请求通知给他包含的具体中介者即可。

在本例子中,同事A分别需要通知B和C一些消息,而B也需要通知A和C一些消息,同样,C也需要通知A和B一些消息。利用中介者模式实现如下:

(1)Colleague.h

 1 #ifndef _COLLEAGUE_H_
 2 #define _COLLEAGUE_H_
 3 #include <string>
 4 #include <iostream>
 5 #include "Mediator.h"
 6 using namespace std;
 7 class ConcreteMediator;
 8
 9 //中介者模式
10 //抽象同事和具体同事的定义 如果没有中介者 他们需要相互包含
11 class Colleague{
12 public:
13     virtual void giveMess(string mess[]) = 0;
14     virtual void receiverMess(string mess) = 0;
15     virtual void setName(string name) = 0;
16     virtual string getName() = 0;
17
18 };
19
20 //具体同事
21 class ColleagueA : public Colleague{
22 public:
23     ColleagueA(ConcreteMediator *mediator);
24     void setName(string name) override;
25     string getName() override;
26     void giveMess(string mess[]) override;
27     void receiverMess(string name) override;
28
29 private:
30     ConcreteMediator *myMediator;
31     string name;
32
33 };
34
35
36 class ColleagueB : public Colleague{
37 public:
38     ColleagueB(ConcreteMediator *mediator);
39     void setName(string name) override;
40     string getName() override;
41     void giveMess(string mess[]) override;
42     void receiverMess(string name) override;
43
44 private:
45     ConcreteMediator *myMediator;
46     string name;
47
48 };
49
50 class ColleagueC : public Colleague{
51 public:
52     ColleagueC(ConcreteMediator *mediator);
53     void setName(string name) override;
54     string getName() override;
55     void giveMess(string mess[]) override;
56     void receiverMess(string name) override;
57
58 private:
59     ConcreteMediator *myMediator;
60     string name;
61
62 };
63
64
65 #endif

(2)Colleague.cpp

 1 #include "Colleague.h"
 2
 3 ColleagueA::ColleagueA(ConcreteMediator *mediator)
 4 {
 5     this->myMediator = mediator;
 6     myMediator->registerColleagueA(this);
 7 }
 8
 9 void ColleagueA::setName(string name)
10 {
11     this->name = name;
12 }
13
14 string ColleagueA::getName()
15 {
16     return name;
17 }
18
19 void ColleagueA::giveMess(string mess[])
20 {
21     //由中介者将消息传递给其同事
22     myMediator->deliverMess(this, mess);
23 }
24
25 void ColleagueA::receiverMess(string mess)
26 {
27     cout << name << "  get message: " << mess << endl;
28 }
29
30 ColleagueB::ColleagueB(ConcreteMediator *mediator)
31 {
32     this->myMediator = mediator;
33     myMediator->registerColleagueB(this);
34 }
35
36 void ColleagueB::setName(string name)
37 {
38     this->name = name;
39 }
40
41 string ColleagueB::getName()
42 {
43     return name;
44 }
45
46 void ColleagueB::giveMess(string mess[])
47 {
48     //由中介者将消息传递给其同事
49     myMediator->deliverMess(this, mess);
50 }
51
52 void ColleagueB::receiverMess(string mess)
53 {
54     cout << name << "  get message: " << mess << endl;
55 }
56
57 ColleagueC::ColleagueC(ConcreteMediator *mediator)
58 {
59     this->myMediator = mediator;
60     myMediator->registerColleagueC(this);
61 }
62
63 void ColleagueC::setName(string name)
64 {
65     this->name = name;
66 }
67
68 string ColleagueC::getName()
69 {
70     return name;
71 }
72
73 void ColleagueC::giveMess(string mess[])
74 {
75     //由中介者将消息传递给其同事
76     myMediator->deliverMess(this, mess);
77 }
78
79 void ColleagueC::receiverMess(string mess)
80 {
81     cout << name << "  get message: " << mess << endl;
82 }

(3)Mediator.h

 1 #ifndef _MEDIATOR_H_
 2 #define _MEDIATOR_H_
 3 #include "Colleague.h"
 4 #include <string>
 5 using namespace std;
 6
 7 class Colleague;
 8 class ColleagueA;
 9 class ColleagueB;
10 class ColleagueC;
11
12
13 //中介者 由于本例子中只有一个中介者 所以只定义一个具体中介者
14
15 class ConcreteMediator{
16 public:
17     void registerColleagueA(ColleagueA *ca);
18     void registerColleagueB(ColleagueB *cb);
19     void registerColleagueC(ColleagueC *cc);
20
21     void deliverMess(Colleague *colleague, string mess[]);
22
23 private:
24     ColleagueA *ca;
25     ColleagueB *cb;
26     ColleagueC *cc;
27 };
28
29 #endif

(4)Mediator.cpp

 1 #include "Mediator.h"
 2
 3 void ConcreteMediator::registerColleagueA(ColleagueA *ca)
 4 {
 5     this->ca = ca;
 6 }
 7
 8 void ConcreteMediator::registerColleagueB(ColleagueB *cb)
 9 {
10     this->cb = cb;
11 }
12
13 void ConcreteMediator::registerColleagueC(ColleagueC *cc)
14 {
15     this->cc = cc;
16 }
17
18 void ConcreteMediator::deliverMess(Colleague *colleague, string mess[])//如果这里需要判断mess的长度,需要将其作为参数传递进来
19 {
20     if (typeid(*colleague) == typeid(*ca))
21     {
22         //通知其他的同事
23         cb->receiverMess(colleague->getName() + mess[0]);
24         cc->receiverMess(colleague->getName() + mess[1]);
25     }
26     else if (typeid(*colleague) == typeid(*cb))
27     {
28         ca->receiverMess(colleague->getName() + mess[0]);
29         cc->receiverMess(colleague->getName() + mess[1]);
30     }
31     else if (typeid(*colleague) == typeid(*cc))
32     {
33         ca->receiverMess(colleague->getName() + mess[0]);
34         cb->receiverMess(colleague->getName() + mess[1]);
35     }
36 }

(5)MediatorMain.cpp

 1 #include "Colleague.h"
 2 #include "Mediator.h"
 3
 4
 5 int main()
 6 {
 7     ConcreteMediator *mediator = new ConcreteMediator();
 8
 9     ColleagueA *ca = new ColleagueA(mediator);
10     ColleagueB *cb = new ColleagueB(mediator);
11     ColleagueC *cc = new ColleagueC(mediator);
12
13     ca->setName("国A");
14     cb->setName("国B");
15     cc->setName("国C");
16
17     string messA[] = { "要求归还100斤土豆", "要求归还20头牛" };
18     ca->giveMess(messA);
19     cout << endl;
20     string messB[] = { "要求归还10只鸡", "要求归还15匹马" };
21     cb->giveMess(messB);
22     cout << endl;
23     string messC[] = { "要求归还300斤小麦", "要求归还50头驴" };
24     cc->giveMess(messC);
25
26     return 0;
27 }

需要注意的是,在中介者中传递消息的时候需要判断当前参数中指向的对象是哪种类型,用到了操作符typeid。它的参数类型是对象,若两个对象是同一个类型则返回true。

中介者模式适合于一个对象需要引用很多其他对象,或者是对象之间的相互引用比较多的情况。

优点也有很多,比如:

(1)将分布于多个对象之间的交互行为集中在一起。

(2)使得各个具体同事之间完全解耦。

等。

时间: 2025-01-17 03:28:41

(七)中介者模式-C++实现的相关文章

设计模式——行为型模式之中介者模式(七)

中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 介绍 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应

23种设计模式--中介者模式-Mediator Pattern

一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再把中介和用户类分成2个类,这样就成了抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.来几个例子比如说各种游戏平台,还有我们最熟悉的QQ平台,等等这些都是中介者模式的具体应用,中介者模式常用于处理通信之间复杂有关联的业务,这样就会存在一个缺点比如说因为中介者处理了好多用户之间的关系,一但发生错

设计模式@第21章:中介者模式

第21章:中介者模式 一.智能家庭项目 智能家庭项目: 智能家庭包括各种设备,闹钟.咖啡机.电视机.窗帘 等 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放 二.传统方案解决智能家庭管理问题 三.传统的方式的问题分析 当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂 各个电器对象彼此联系,你中有我,我中有你,不利于松耦合. 各个电器对象之间所传递的消息(参数),容易混乱 当系统增加一个新

从王者荣耀看设计模式(二十一.中介者模式)

从王者荣耀看设计模式(中介者模式) 一.简介 在王者荣耀中,有一个简单的聊天室,在聊天室中.玩家点击综合可以与全服的玩家发送消息,点击好友可向指定好友玩家私发信息.|??ω?` ) 二.模式动机 联合国是一个协调组织,各个国家就一些共同问题经由联合国进行协商,它取代了原本各个国家之间的直接交流,将各个成员国之间的强耦合关系转换为较为松散的耦合关系.在软件开发中,我们有时候也会需要使用类似联合国一样的中间对象来降低系统中类与类,对象与对象之间的耦合关系. 在本实例中,玩家与玩家多对多的通信,导致用

第19章 行为型模式—中介者模式

1. 中介者模式(Mediator Pattern)的定义 (1)定义:用一个中介对象来封装一系统对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.       ①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些. ②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系. (2)中介者模式的结构和说明 ①Mediator: 中介者接口.在里面定义各个同事之间交互需要的方法,可以

《大话设计模式》学习笔记21:中介者模式

同事间接收消息示例: 1.Mediator: public abstract class Mediator { public abstract void Send(string message, Colleague colleague); } 2.Colleague: public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator

设计模式开始--中介者模式

中介者模式 一.问题 用一个中介对象来封装一系列对象的交互,好多对象之间交互,会形成错综复杂的网络,类和类之间相互引用,表现形式是多对多,为了改变这种紧耦合的情况,引入中介者,用中介者与各个类进行交互,形成一个星形的网络,中介者在星形网络的中间,其余的对象组成网络的每一个边 二.类图和实例 (1)未使用中介者(联合国)之前的国与国家之间的联系 (2)使用了中介者之后,国与国之间联系通过联合国进行联系 (3)类图设计 三.实现 (1)抽象中介者用于定义格式 具体中介者用于定义那几个类之间有关系,他

java中介者模式

中介者模式主要在于解耦,使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 应用场景: 1.当一组对象要进行沟通或者业务上的交互,但是其关系又很复杂混乱时. 2.当一个对象与其他对象要进行紧密的交互,又不想依赖于其他对象时. 3.想创造一个运行于多个类之间的对象,又不想生成新的子类. 附代码: 1 abstract class Link { //对象父类 2 protected int number; 3 4 public int getNumber() { 5 ret

中介者模式(Mediator)

一.中介者模式介绍 中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用.从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式核心:1.就是将网状结构处理成星型结构      2.将多对多处理成一对多 例如:世界上各个国家的和平和安全,沟通和交流等等问题,如果各个国家都可以互相交互的话,容易造成混乱,关系复杂. 这个时候联合国的作用就出现了,联合国作为一个中介对象来维护各个国家的和平和安全等等的工作. 中介者模式UML图: 例如:公司中如果没有部门经理