中介者模式
- 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 共同实体
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 抽象的中介者
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 抽象的被中介者
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 具体的中介者
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 具体的被中介者
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 调用者
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 结果
王老师:
生成老师
创建中介者
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种设计模式