中介者模式

类图

代码

Colleague

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
abstract class Person{
private String name;
private Mediator mediator;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Mediator getMediator() {
return mediator;
}

public void setMediator(Mediator mediator) {
this.mediator = mediator;
}

public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}

ColleagueA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class HouseOwner extends Person{

public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}

public void contact(String message){
this.getMediator().contact(message, this);
}

public void getMessage(String message){
System.out.println("房主:" + this.getName() + "获得信息:" + message);
}
}

ColleagueB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Tenant extends Person{

public Tenant(String name, Mediator mediator) {
super(name, mediator);
}

public void contact(String message){
this.getMediator().contact(message, this);
}

public void getMessage(String message){
System.out.println("租房者:" + this.getName() + "获得信息:" + message);
}
}

Mediator

1
2
3
abstract class Mediator{
abstract void contact(String message, Person person);
}

ConcreteMediator

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
class MediatorStructure extends Mediator{

private HouseOwner houseOwner;

private Tenant tenant;

public HouseOwner getHouseOwner() {
return houseOwner;
}

public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}

public Tenant getTenant() {
return tenant;
}

public void setTenant(Tenant tenant) {
this.tenant = tenant;
}

@Override
void contact(String message, Person person) {
if(person == houseOwner){
tenant.getMessage(message);
}else{
houseOwner.getMessage(message);
}
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
public static void main(String args[]){
//一个房主、一个租房者、一个中介机构
MediatorStructure mediator = new MediatorStructure();

//房主和租房者只需要知道中介机构即可
HouseOwner houseOwner = new HouseOwner("张三", mediator);
Tenant tenant = new Tenant("李四", mediator);

//中介结构要知道房主和租房者
mediator.setHouseOwner(houseOwner);
mediator.setTenant(tenant);

tenant.contact("听说你那里有三室的房主出租.....");
houseOwner.contact("我有房子要出租");
}
}

运行结果

1
2
房主:张三获得信息:听说你那里有三室的房主出租.....
租房者:李四获得信息:我有房子要出租

总结

优点

适当地使用可以避免同事类之间的耦合

缺点

有些时候同事之间的关系不会复杂到网状结构,所以不要滥用中介者模式,会大幅增加系统的复杂度