中介者模式

定义

定义一个封装一组对象如何交互的对象;
通过使对象明确地相互引用来促进松散耦合,并允许独立的改变它们的交互;
行为型

适用场景

  • 系统对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;
  • 交互的公共行为,如果需要改变行为则可以增加新的中介类。

优点和缺点

优点

  • 将一对多转化成了一对一,降低程序复杂度
  • 类之间的解耦

缺点

  • 中介者过多,导致系统复杂

结构

  • 抽象中介者角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  • 具体中介者角色:实现中介者接口,定义一个List来管理同事对象,协调各个同事之间的交互关系,因此它依赖于同事角色。
  • 抽象同事类角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  • 具体同事类角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

代码实现

假设有一个中介小刘,做房产中介,有两个房东来找租客
抽象中介者角色,可以理解为中介这一个行业

1
2
3
4
5
6
public abstract class Mediator {

public abstract void register(Colleague colleague);
public abstract void relay(Colleague cl);

}

具体中介者角色
中介小刘,聚合了同事角色,也就是聚合了房东,保留房东的联系方式,两个方法,一个保存房东联系方式,一个给房东联系的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class XiaoLiuMediator extends Mediator{
private List<Colleague> colleagues = new ArrayList<>();
@Override
public void register(Colleague colleague) {
if (!colleagues.contains(colleague)) {
colleagues.add(colleague);
colleague.setMedium(this);
}
}
@Override
public void relay(Colleague cl) {
for (Colleague ob : colleagues) {
if (!ob.equals(cl)) {
ob.receive();
}
}
}
}

抽象同事类角色
聚合了一个中介,有三个方法,一个是保存中介信息,一个是联系中介租房的,一个是讨价还价的

1
2
3
4
5
6
7
8
public abstract class Colleague {
protected Mediator mediator;
public void setMedium(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive();
public abstract void send();
}

具体同事类角色1

1
2
3
4
5
6
7
8
9
public class LandlordColleague1 extends Colleague {
public void receive() {
System.out.println("2000少一分都不行。");
}
public void send() {
System.out.println("我有房子要出租。");
mediator.relay(this);
}
}

具体同事类角色2

1
2
3
4
5
6
7
8
9
public class LandlordColleague2 extends Colleague {
public void receive() {
System.out.println("1800一分都不能少。");
}
public void send() {
System.out.println("我也有房子要出租。");
mediator.relay(this); //请中介者转发
}
}

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
public static void main(String[] args) {
Mediator mediator = new XiaoLiuMediator();

Colleague l1 = new LandlordColleague1();
Colleague l2 = new LandlordColleague2();

mediator.register(l1);
mediator.register(l2);

l1.send();
System.out.println("-------------------");
l2.send();
}
}

结果:

1
2
3
4
5
我有房子要出租。
1800一分都不能少。
-------------------
我也有房子要出租。
2000少一分都不行。

UML类图