一、简介
1、中介者模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的交互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
2、成员类
Mediator:中介者接口。在里面定义了各个同事之间相互交互所需要的方法。
ConcreteMediator:具体的中介者实现对象。它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。
Colleague:同事类的定义,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能。
ConcreteColleague:具体的同事类,实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。
3、UML
4、所属类别:行为型
二、C++程序
1 // 中介者模式.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 #include<string>
7 using namespace std;
8 class Colleage
9 {
10 public:
11 Colleage(){}
12 virtual~Colleage(){}
13 };
14 class Mediator
15 {
16 public:
17 Mediator(){}
18 virtual ~Mediator(){}
19 virtual void declare(string ,Colleage *)=0;
20 };
21
22 class Concretecolleage1:public Colleage
23 {
24 private:
25 Mediator *mediator;
26 public:
27 Concretecolleage1(Mediator * m)
28 {
29 mediator=m;
30 }
31 virtual~Concretecolleage1(){}
32 void talk(string s)
33 {
34 mediator->declare(s,this);
35 }
36 void receive(string s)
37 {
38 cout<<"Concretecolleage1接收到对方的消息:"<<s<<endl;
39 }
40 };
41 class Concretecolleage2:public Colleage
42 {
43 private:
44 Mediator *mediator;
45 public:
46 Concretecolleage2(Mediator * m)
47 {
48 mediator=m;
49 }
50 virtual~Concretecolleage2(){}
51 void talk(string s)
52 {
53 mediator->declare(s,this);
54 }
55 void receive(string s)
56 {
57 cout<<"Concretecolleage2接收到对方的消息:"<<s<<endl;
58 }
59 };
60 class Concretemediator:public Mediator
61 {
62 private:
63 Concretecolleage1 *concretecolleage1;
64 Concretecolleage2 *concretecolleage2;
65 public:
66 Concretemediator(){}
67 virtual ~Concretemediator(){}
68 void setConcretecolleage1(Concretecolleage1 * value)
69 {
70 concretecolleage1=value;
71 }
72 void setConcretecolleage2(Concretecolleage2 * value)
73 {
74 concretecolleage2=value;
75 }
76 virtual void declare(string s,Colleage * m)
77 {
78 if(m==concretecolleage1)
79 {
80 concretecolleage2->receive(s);
81 }
82
83 if(m==concretecolleage2)
84 {
85 concretecolleage1->receive(s);
86 }
87 }
88 };
89
90
91 int _tmain(int argc, _TCHAR* argv[])
92 {
93 //设置两个要通信的人和一个中介者
94 Concretemediator *phone=new Concretemediator();
95 Concretecolleage1 * xie=new Concretecolleage1(phone);
96 Concretecolleage2 * lala=new Concretecolleage2(phone);
97 phone->setConcretecolleage1(xie);
98 phone->setConcretecolleage2(lala);
99 xie->talk("去吃饭吧?");
100 lala->talk("好的呀,马上就走");
101 return 0;
102 }