文章

23种设计模式----中介者模式----行为型模式

本文深入讲解中介者模式,包括其定义、角色、应用场景及其实现案例。通过具体代码示例,展示中介者模式如何减少对象间的直接依赖,提高系统的灵活性和可维护性。

23种设计模式----中介者模式----行为型模式

文章信息

  • 原文链接:https://jiayq.blog.csdn.net/article/details/84798870
  • 发布时间:2018-12-04 21:10:23
  • 阅读量:556
  • 分类:java同时被 2 个专栏收录, 订阅专栏, 设计模式
  • 标签:#中介者模式, #仲裁者模式, #观察者模式, #行为模式, #23种设计模式

摘要

文章浏览阅读556次。本文深入讲解中介者模式,包括其定义、角色、应用场景及其实现案例。通过具体代码示例,展示中介者模式如何减少对象间的直接依赖,提高系统的灵活性和可维护性。


中介者模式

  • 1.什么是中介者模式
  • 2.中介者模式的角色
  • 3.例子
    • 3.1 项目结构
      • 3.2 共同实体
      • 3.3 抽象的中介者
      • 3.4 抽象的被中介者
      • 3.5 具体的中介者
      • 3.6 具体的被中介者
      • 3.7 调用者
      • 3.8 结果
  • 4.总结

23种设计模式

1.什么是中介者模式

在幼儿园,小朋友在课间总是说个不停,但是由于每个人都在吵,老师受不了了,老师说:谁想说话就举手,我提问谁谁需要回答。
在这种情况下:
老师就是中介者,小朋友就是被中介者。
中介者还有另一种说法:仲裁者。。。

2.中介者模式的角色

在1中我们说到,中介者模式有时又叫做仲裁者模式,为什么呢?

首先需要明白中介者模式的一些角色:

抽象的中介者(Mediator)
具体的中介者(ConcreteMediator)
抽象的被中介者(Colleague)
具体的被中介者(ConcreteColleague)

第一种:中介者

被中介者之间需要通信,但是被中介者相互调用,非常的复杂,那么被中介者之间通信通过中介者来进行,中介者做转发。

中介者收到被中介者的通信后,会做出响应,是转发还是不转发。。。。(转发就会调用目标被中介者的方法,不转发调用失败)

中介者将类之间的强关联通过转发方式转化为了弱关联。
一般是中介者关联被中介者的接口或者基类,这样扩展非常容易。

第二种:仲裁者

被仲裁者都有相同的方法需要执行,但是执行哪一个被仲裁者的方法?

仲裁者指定被仲裁者,被仲裁者执行自己的方法。。

3.例子

对于中介者:
学生a希望老师转达学生b一个消息
对于仲裁者:
老师随机提问一个学生,学生需要作出回答。

3.1 项目结构

在这里插入图片描述

3.2 共同实体

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
package domain;

import java.io.Serializable;

public class Info implements Serializable{

	private static final long serialVersionUID = 8468185044512901245L;

	private String name;
	
	private Integer age;
	
	private Boolean sex;

	public Info(String name,Integer age,Boolean sex){
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	
	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Boolean getSex() {
		return sex;
	}

	public void setSex(Boolean sex) {
		this.sex = sex;
	}
	
}

3.3 抽象的中介者

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
package mediator.abs;

import java.util.Observable;
import java.util.Observer;

import domain.Info;

public abstract class Teacher implements Observer{
	
	protected Info info;

	//提问被中介者
	public abstract void setFocus(Observable observable);
	
	//访问者模式的update方法就是中介者的仲裁方法
	
	public Teacher(Info info){
		this.info = info;
	}
	
	
	public Info getInfo() {
		return info;
	}

	public void setInfo(Info info) {
		this.info = info;
	}
	
}

3.4 抽象的被中介者

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
package colleague.abs;

import java.util.Observable;
import java.util.Observer;

import domain.Info;

public abstract class Student extends Observable {

	protected Info info;

	//绑定中介者
	public abstract void addTeacher(Observer teacher);
	
	//向中介者通信
	public abstract void inform(String msg);
	
	//删除中介者
	public abstract void delTeacher(Observer observer);
	
	//响应中介者的通信
	public abstract void answer();
	
	public Student(Info info){
		super();
		this.info = info;
	}
	
	public Info getInfo() {
		return info;
	}

	public void setInfo(Info info) {
		this.info = info;
	}
	
}

3.5 具体的中介者

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
package mediator.impl;

import java.util.Observable;

import colleague.abs.Student;
import domain.Info;
import mediator.abs.Teacher;

public class Teacher1 extends Teacher{

	public Teacher1(Info info) {
		super(info);
		System.out.println(info.getName()+":");
		System.out.println("生成老师");
		System.out.println("创建中介者");
		System.out.println();
	}

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("mediator对colleague的信息进行仲裁");
		System.out.println("name:"+super.getInfo().getName());
		System.out.println("age:"+super.getInfo().getAge());
		System.out.println("sex:"+(super.getInfo().getSex()?"男":"女"));
		Student student = (Student) o;
		System.out.println(super.getInfo().getName() + "老师已经知道"
				+ student.getInfo().getName() + "说的" + arg);
		System.out.println(student.getInfo().getName()+"说的"+arg);
	}

	@Override
	public void setFocus(Observable observable) {
		Student student = (Student) observable;
		System.out.println("mediator向colleague通信");
		student.answer();
	}

}




package mediator.impl;

import java.util.Observable;

import colleague.abs.Student;
import domain.Info;
import mediator.abs.Teacher;

public class Teacher2 extends Teacher{

	public Teacher2(Info info) {
		super(info);
		System.out.println("Teacher2");
		System.out.println(info.getName()+":");
		System.out.println("生成老师");
		System.out.println("创建中介者");
		System.out.println();
	}

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("Teacher2");
		System.out.println("mediator对colleague的信息进行仲裁");
		System.out.println("name:"+super.getInfo().getName());
		System.out.println("age:"+super.getInfo().getAge());
		System.out.println("sex:"+(super.getInfo().getSex()?"男":"女"));
		Student student = (Student) o;
		System.out.println(super.getInfo().getName() + "老师已经知道"
				+ student.getInfo().getName() + "说的" + arg);
		System.out.println(student.getInfo().getName()+"说的"+arg);
	}

	@Override
	public void setFocus(Observable observable) {
		System.out.println("Teacher2");
		Student student = (Student) observable;
		System.out.println("mediator向colleague通信");
		student.answer();
	}

}

3.6 具体的被中介者

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package colleague.impl;

import java.util.Observer;

import mediator.abs.Teacher;
import colleague.abs.Student;
import domain.Info;

public class Student1 extends Student{

	public Student1(Info info) {
		super(info);
	}

	@Override
	public void addTeacher(Observer teacher) {
		super.addObserver(teacher);
		System.out.println("colleague增加自己的mediator");
		System.out.println(super.getInfo().getName()+":");
		System.out.println(super.getInfo().getName()+"设置自己的老师");
	}

	@Override
	public void inform(String msg) {
		System.out.println("colleague发信信息给mediator");
		super.setChanged();
		System.out.println(super.getInfo().getName()+":");
		System.out.println(super.getInfo().getAge());
		System.out.println("学生"+super.getInfo().getName()+"报告老师msg:"+msg);
		super.notifyObservers(msg);
	}

	@Override
	public void delTeacher(Observer observer) {
		Teacher teacher = (Teacher) observer;
		System.out.println("colleague不在设置自己的mediator");
		super.deleteObserver(teacher);
		System.out.println(super.getInfo().getName()+":");
		System.out.println(super.getInfo().getSex()?"男":"女");
		System.out.println(super.getInfo().getName() + "学生从"
				+ teacher.getInfo().getName() + "老师这里毕业");
	}

	@Override
	public void answer() {
		System.out.println("collergue对mediator的消息进行响应");
		System.out.println(super.getInfo().getName()+":");
		System.out.println("name="+super.getInfo().getName());
		System.out.println("age="+super.getInfo().getAge());
		System.out.println("sex="+(super.getInfo().getSex()?"男":"女"));
	}

	
	
}




package colleague.impl;

import java.util.Observer;

import mediator.abs.Teacher;
import colleague.abs.Student;
import domain.Info;

public class Student2 extends Student{

	public Student2(Info info) {
		super(info);
	}

	@Override
	public void addTeacher(Observer teacher) {
		System.out.println("Student2");
		super.addObserver(teacher);
		System.out.println("colleague增加自己的mediator");
		System.out.println(super.getInfo().getName()+":");
		System.out.println(super.getInfo().getName()+"设置自己的老师");
	}

	@Override
	public void inform(String msg) {
		System.out.println("Student2");
		System.out.println("colleague发信信息给mediator");
		super.setChanged();
		System.out.println(super.getInfo().getName()+":");
		System.out.println(super.getInfo().getAge());
		System.out.println("学生"+super.getInfo().getName()+"报告老师msg:"+msg);
		super.notifyObservers(msg);
	}

	@Override
	public void delTeacher(Observer observer) {
		Teacher teacher = (Teacher) observer;
		System.out.println("Student2");
		System.out.println("colleague不在设置自己的mediator");
		super.deleteObserver(teacher);
		System.out.println(super.getInfo().getName()+":");
		System.out.println(super.getInfo().getSex()?"男":"女");
		System.out.println(super.getInfo().getName() + "学生从"
				+ teacher.getInfo().getName() + "老师这里毕业");	}

	@Override
	public void answer() {
		System.out.println("Student2");
		System.out.println("collergue对mediator的消息进行响应");
		System.out.println(super.getInfo().getName()+":");
		System.out.println("name="+super.getInfo().getName());
		System.out.println("age="+super.getInfo().getAge());
		System.out.println("sex="+(super.getInfo().getSex()?"男":"女"));
		System.out.println(getInfo().getName()+"是最"+(getInfo().getSex()?"帅":"漂亮")+"的");
	}

}

3.7 调用者

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
package client;

import mediator.impl.Teacher1;
import mediator.impl.Teacher2;
import colleague.impl.Student1;
import colleague.impl.Student2;
import domain.Info;

public class Main {

	public static void main(String[] args) {
		
		//生成老师,同学
		Student1 student1 = new Student1(new Info("赵小明", 16, Boolean.TRUE));
		
		Teacher1 teacher1 = new Teacher1(new Info("王老师", 36, Boolean.FALSE));
		
		//学生找到自己的老师
		student1.addTeacher(teacher1);
		
		//学生请求老师(问问题)
		student1.inform("老师好");
		
		//老师提问学生
		teacher1.setFocus(student1);
		
		System.out.println();
		System.out.println("另一个学生");
		System.out.println();
		
		//增加另一个学生
		Student1 student12 = new Student1(new Info("李敏", 18, Boolean.FALSE));
		
		student12.addTeacher(teacher1);
		
		student12.inform("老师很漂亮");
		
		teacher1.setFocus(student12);
		
		System.out.println();
		System.out.println("另一种学生");
		System.out.println();
		
		//增加另一种学生
		Student2 student2 = new Student2(new Info("好学生", 17, Boolean.TRUE));
		
		student2.addTeacher(teacher1);
		
		student2.inform("老师讲的很明白");

		teacher1.setFocus(student2);
		
		//删除老师
		
		student1.delTeacher(teacher1);
		
		System.out.println();
		System.out.println("增加另一种老师");
		System.out.println();
		
		//增加另一种老师
		Teacher2 teacher2 = new Teacher2(new Info("美女老师", 33, Boolean.FALSE));
		
		student1.addTeacher(teacher2);
		student12.addTeacher(teacher2);
		student2.addTeacher(teacher2);
		
		student1.inform("美女老师:"+student1.getInfo().getName());
		student12.inform("漂亮老师:"+student12.getInfo().getName());
		student2.inform("女神老师:"+student2.getInfo().getName());
		
		teacher2.setFocus(student1);
		teacher2.setFocus(student12);
		teacher2.setFocus(student2);
		
		student1.delTeacher(teacher1);
		student1.delTeacher(teacher2);
		student12.delTeacher(teacher1);
		student12.delTeacher(teacher2);
		student2.delTeacher(teacher1);
		student2.delTeacher(teacher2);
	}

}

3.8 结果

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
王老师:
生成老师
创建中介者

colleague增加自己的mediator
赵小明:
赵小明设置自己的老师
colleague发信信息给mediator
赵小明:
16
学生赵小明报告老师msg:老师好
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道赵小明说的老师好
赵小明说的老师好
mediator向colleague通信
collergue对mediator的消息进行响应
赵小明:
name=赵小明
age=16
sex=男

另一个学生

colleague增加自己的mediator
李敏:
李敏设置自己的老师
colleague发信信息给mediator
李敏:
18
学生李敏报告老师msg:老师很漂亮
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道李敏说的老师很漂亮
李敏说的老师很漂亮
mediator向colleague通信
collergue对mediator的消息进行响应
李敏:
name=李敏
age=18
sex=女

另一种学生

Student2
colleague增加自己的mediator
好学生:
好学生设置自己的老师
Student2
colleague发信信息给mediator
好学生:
17
学生好学生报告老师msg:老师讲的很明白
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道好学生说的老师讲的很明白
好学生说的老师讲的很明白
mediator向colleague通信
Student2
collergue对mediator的消息进行响应
好学生:
name=好学生
age=17
sex=男
好学生是最帅的
colleague不在设置自己的mediator
赵小明:
男
赵小明学生从王老师老师这里毕业

增加另一种老师

Teacher2
美女老师:
生成老师
创建中介者

colleague增加自己的mediator
赵小明:
赵小明设置自己的老师
colleague增加自己的mediator
李敏:
李敏设置自己的老师
Student2
colleague增加自己的mediator
好学生:
好学生设置自己的老师
colleague发信信息给mediator
赵小明:
16
学生赵小明报告老师msg:美女老师:赵小明
Teacher2
mediator对colleague的信息进行仲裁
name:美女老师
age:33
sex:女
美女老师老师已经知道赵小明说的美女老师:赵小明
赵小明说的美女老师:赵小明
colleague发信信息给mediator
李敏:
18
学生李敏报告老师msg:漂亮老师:李敏
Teacher2
mediator对colleague的信息进行仲裁
name:美女老师
age:33
sex:女
美女老师老师已经知道李敏说的漂亮老师:李敏
李敏说的漂亮老师:李敏
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道李敏说的漂亮老师:李敏
李敏说的漂亮老师:李敏
Student2
colleague发信信息给mediator
好学生:
17
学生好学生报告老师msg:女神老师:好学生
Teacher2
mediator对colleague的信息进行仲裁
name:美女老师
age:33
sex:女
美女老师老师已经知道好学生说的女神老师:好学生
好学生说的女神老师:好学生
mediator对colleague的信息进行仲裁
name:王老师
age:36
sex:女
王老师老师已经知道好学生说的女神老师:好学生
好学生说的女神老师:好学生
Teacher2
mediator向colleague通信
collergue对mediator的消息进行响应
赵小明:
name=赵小明
age=16
sex=男
Teacher2
mediator向colleague通信
collergue对mediator的消息进行响应
李敏:
name=李敏
age=18
sex=女
Teacher2
mediator向colleague通信
Student2
collergue对mediator的消息进行响应
好学生:
name=好学生
age=17
sex=男
好学生是最帅的
colleague不在设置自己的mediator
赵小明:
男
赵小明学生从王老师老师这里毕业
colleague不在设置自己的mediator
赵小明:
男
赵小明学生从美女老师老师这里毕业
colleague不在设置自己的mediator
李敏:
女
李敏学生从王老师老师这里毕业
colleague不在设置自己的mediator
李敏:
女
李敏学生从美女老师老师这里毕业
Student2
colleague不在设置自己的mediator
好学生:
男
好学生学生从王老师老师这里毕业
Student2
colleague不在设置自己的mediator
好学生:
男
好学生学生从美女老师老师这里毕业

4.总结

本来中介者和被中介者之间是强关联,但是使用了观察者模式后,强关联变成弱关联。

对于单独的中介者来说,随着功能的扩充,中介者会越来越庞大。
但是经过与观察者模式结合后,中介者和被中介者处于同一等级上:
中介者庞大了可以在新开一个中介者
被中介者庞大了可以在新开一个被中介者

解决了单独的中介者模式的一个弊端。。。。
23种设计模式

本文由作者按照 CC BY 4.0 进行授权