中介者模式(Mediator)

First Post:

Last Update:

中介者模式(Mediator)

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

中介者模式结构图

中介者模式代码结构

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
    abstract class Mediator
{
//定义一个抽象的发生消息方法,得到同事对象和发送消息。
public abstract void Send(string message,Colleague colleague);
}

abstract class Colleague
{
protected Mediator mediator;

public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
}

class ConcreteMediator : Mediator
{
private ConcreteColleague1 colleague1;
public ConcreteColleague1 Colleague1
{
set { colleague1 = value; }
}

private ConcreteColleague2 colleague2;
public ConcreteColleague2 Colleague2
{
set { colleague2 = value; }
}

public override void Send(string message, Colleague colleague)
{
if(colleague==colleague1)
{
colleague2.Notify(message);
}else
{
colleague1.Notify(message);
}
}

}

class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(Mediator mediator) : base(mediator)
{

}
public void Notify(string message) { Console.WriteLine("同事1得到消息"+message); }
public void Send(string message) { mediator.Send(message, this); }
}
class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(Mediator mediator) : base(mediator)
{

}
public void Notify(string message) { Console.WriteLine("同事2得到消息" + message); }
public void Send(string message) { mediator.Send(message,this); }
}

//客户端代码:
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 c1 = new ConcreteColleague1(mediator);
ConcreteColleague2 c2 = new ConcreteColleague2(mediator);//两个同事类均认识中介者对象
mediator.Colleague1 = c1;
mediator.Colleague2 = c2;
c1.Send("111");
c2.Send("222");

中介者模式总结

  1. 尽管将一个系统分割成许多对象通常可以增加其复用性,但是对象间相互连接的激增又会降低其可复用性。

  2. 大量的连接使得一个对象不能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的任何行为进行较大的改动就十分困难了。

  3. 通过中介者模式,系统从复杂交织的网状结构变成了以中介者为中心的星形结构,每个具体对象不再通过直接的联系与另一个对象发生相互作用吗,而是通过中介者对象与另一个对象发生相互作用。

  4. 中介者模式一般应用在一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而不想产生过多子类的场合。

中介者模式的缺点

缺点很明显,所有的具体联系必须由中介者来定义,必须了解所有需要联系的类,此时将会使得中介者类过于复杂(责任过多)

优点

将考虑交互复杂性变为了中介者的复杂性,减轻了类联系的耦合性,将关注的对象从对象各自本身的行为转移到了它们之间的交互联系上。从更加宏观的角度看待系统。