设计模式GOF23--中介模式

场景

  • 在实际的公司运营中,都有一个总经理来协调管理各个部门。那么这里的总经理起到中介、协调的作用。这是一个典型的中介者模式

核心

  • 如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量 多对多关系,将导致关系及其复杂,这些对象称之为同事对象
  • 我们可以引用一个中介者对象,使各个同时对象只跟中介者对象打交道,将复杂的网络结构化解为星形结构

结构图

代码解析

我们通过模拟公司日常运营中,总经理和各个部门之间处理事情场景,来用代码实现中介者模式

定义同事类(部门接口和具体部门)

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/**
* 同事类接口
*/
public interface Department {
/**
* 做本部门的事情
*/
void selfAction();

/**
* 向总经理发出申请
*/
void outAction();
}

/**
* 研发部
*/
public class Development implements Department {
private Mediator m; //持有中介者(总经理)的引用

public Development(Mediator m) {
super();
this.m = m;
//当前部门注册到中介者中
m.register("development",this);
}

@Override
public void outAction() {
System.out.println("汇报工作!没钱了,需要资金支持!");
}

@Override
public void selfAction() {
System.out.println("专心科研,开发项目!");
}
}

/**
* 财务部
*/
public class Finacial implements Department {
private Mediator m; //持有中介者(总经理)的引用

public Finacial(Mediator m) {
super();
this.m = m;
//当前部门注册到中介者中
m.register("finacial",this);
}

@Override
public void outAction() {
System.out.println("汇报工作!钱太多了,怎么花!");
}

@Override
public void selfAction() {
System.out.println("数钱!");
}
}


/**
* 市场部
*/
public class Market implements Department {
private Mediator m; //持有中介者(总经理)的引用

public Market(Mediator m) {
super();
this.m = m;
//当前部门注册到中介者中
m.register("market",this);
}

@Override
public void outAction() {
System.out.println("汇报工作!项目承接的进度,需要资金支持!");
//调用财务部
m.command("finacial");
}

@Override
public void selfAction() {
System.out.println("跑项目!");
}
}

中介者(总经理接口和具体实现)

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
/**
*中介者
*/
public interface Mediator {
/**
*
* @param dname 部门名称
* @param department 同事类
*/
void register(String dname,Department department);

/**
* 发出命令
* @param dname
*/
void command(String dname);
}

/**
* 总经理
*/
public class President implements Mediator{

private Map<String,Department> map = new HashMap<>();

@Override
public void register(String dname, Department department) {
map.put(dname,department);
}

@Override
public void command(String dname) {
map.get(dname).selfAction();
}
}

调用

1
2
3
4
5
6
7
8
9
10
11
12
public class Client {
public static void main(String[] args) {
Mediator m = new President();

Market market = new Market(m);
Development department = new Development(m);
Finacial finacial = new Finacial(m);

market.selfAction();
market.outAction();
}
}
结果:
跑项目!
汇报工作!项目承接的进度,需要资金支持!
数钱!

中介者模式的本质

  • 解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系

开发中常见的场景:

  • MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交道)
  • 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
  • 图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以使整体的窗口对象或者DOM对象
  • java.lang.reflect.Method#invoke()
注:该博文为学习总结,视频来源为高淇java300集