定义
- 定义了<u>一个封装一组对象</u>交互的<u>对象</u>。
- 通过使对象明确的相互引用来促进松散耦合,并允许独立的改变他们的交互。
适用场景
- 系统中的对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
- 交互的公共行为,如果需要改变行为则可以增加新的中介者类。
缺点
- 导致系统复杂。
代码
我们小时候在班级上,都有课代表,比如数学课代表,当数学老师下课时,可能忘留作业了,那么他就会叫班长去办公室,告诉他数学作业,让他将作业转达给所有同学。
进行抽象
- 老师
- 班长(中介者)
老师抽象类(Teacher)
/**
* 老师
*/
public abstract class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void homework(String homework, StudentMediator studentMediator);
}
数学和语文老师具体实现类
public class MathTeacher extends Teacher {
public MathTeacher(String name) {
super(name);
}
@Override
public void homework(String homework, StudentMediator studentMediator) {
studentMediator.conveyHomework(this,homework);
}
}
public class EnglishTeacher extends Teacher {
public EnglishTeacher(String name) {
super(name);
}
@Override
public void homework(String homework, StudentMediator studentMediator) {
studentMediator.conveyHomework(this,homework);
}
}
班干部抽象类
/**
* 班干部
*/
public abstract class StudentMediator {
public abstract void conveyHomework(Teacher teacher,String homework);
}
班长具体实现类
/**
* 班长
*/
public class Monitor extends StudentMediator {
@Override
public void conveyHomework(Teacher teacher,String homework) {
System.out.println(teacher.getName()+ "布置作业:" + homework);
}
}
UML类图
studentUML.jpg
我们可以清晰的看出 中介(学生干部) 传达任何老师布置的内容。
测试代码
public class Test {
public static void main(String[] args) {
Teacher englishTeacher = new EnglishTeacher("英语老师");
Teacher mathTeacher = new MathTeacher("数学老师");
StudentMediator mediator = new Monitor();
mathTeacher.homework("背诵唐诗300首",mediator);
englishTeacher.homework("试卷2套",mediator);
}
}
结果
数学老师布置作业:背诵唐诗300首
英语老师布置作业:试卷2套
改变场景
班长突然跟语文老师闹矛盾,不帮助语文老师布置作业,我们可以修改 Monitor
/**
* 班长
*/
public class Monitor extends StudentMediator {
@Override
public void conveyHomework(Teacher teacher,String homework) {
if("语文老师".equals(teacher.getName())) {
System.out.println("自己去教室布置作业");
}else{
System.out.println(teacher.getName()+ "布置作业:" + homework);
}
}
}
这样我们就实现了独立改变一组对象中的某一些交互实现。
小结
在学习中介者模式的时候,觉得会跟 其他模式弄混淆,比如外观模式,针对这种模式,还是需要在具体的业务之中探索。













网友评论