目录
MasterJiImpl类实现了调停者接口中的switchCall方法,对任意发过来的请求进行处理和转发,实现person对象之间的调用,这几个类的结构图如下
调停者模式使控制集中化,所有的交互行为都集中在调停者类中,但随着调停者类变的日益庞大,其维护成本会越来越大
1,使用场景
家庭中成员的沟通交流,班级中同学之间的交流,工作中任务的协调,当互动的对象达到一定数量后.简单的对象到对象的调用就会显得过于复杂,这个时候就需要一个中间人来承担沟通协调的角色,这就是调停者在现实中的使用场景.代码中通过调停者模式可以将复杂的多对多关系转化为简单的一对多多对一的关系,通过调停者这一服务可以极大降低代码中对像间调用的耦合度.
2,准备工作
2.1 person类
package demo;
/**
* @author 作者 Your-Name:Pxy
* @version 创建时间:2020年11月6日 下午8:38:31
* 类说明 人共有属性
*/
public class Person {
private String name ;//姓名
private String gender;//性别
private String age;//年龄
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Person(String name, String gender, String age,String message) {
super();
this.name = name;
this.gender = gender;
this.age = age;
this.message = message;
}
public Person(String name, String gender, String age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "我叫"+name+",我是一名"+age+"岁的"+gender+"我的任务信息是"+message;
}
}
2.2 Students类
package demo;
/**
* @author 作者 Your-Name:Pxy
* @version 创建时间:2020年11月6日 下午7:55:12
* 类说明 学生的实体类 ,除了有person类的基础属性外,还有一些自己特有的方法
*/
public class Students extends Person{
public static final String StudentsFlag = "[学生处理请求]::";
public Students() {//构造方法
super();
}
public Students(String name, String gender, String age, String message) {//构造方法
super(name, gender, age, message);
}
public Students(String name, String gender, String age) {//构造方法
super(name, gender, age);
}
public void doHomeWork(String requestId,Person person){
System.out.println(requestId+StudentsFlag+"我是"+this.getName()+"."+person.getName()+"让我"+person.getMessage()+"我完成了");
}
public void doSelf(String requestId,String message){
System.out.println(requestId+StudentsFlag+"我是"+this.getName()+".我我完成了"+super.getMessage());
}
public void play(String requestId,Person person){
System.out.println(requestId+StudentsFlag+"我是"+this.getName()+"."+person.getName()+"找我"+person.getMessage()+".我觉得可以");
}
}
2.3 Teacher类
package demo;
/**
* @author 作者 Your-Name:Pxy
* @version 创建时间:2020年11月6日 下午8:40:00
* 类说明 老师的一个实体,除了有person类的基础属性外,还有一些自己特有的方法
*/
public class Teacher extends Person {
public static final String TeacherFlag = "[老师处理请求]";
public Teacher() {
super();
}
public Teacher(String name, String gender, String age, String message) {
super(name, gender, age, message);
}
public Teacher(String name, String gender, String age) {
super(name, gender, age);
}
public void putResources(String requestId ,Person person){
System.out.println(requestId+TeacherFlag+"我是"+this.getName()+"."+person.getName()+"需要"+person.getMessage()+".我找了一下发现没有");
}
}
说明:每一个person对象都有姓名,性别,年龄和任务信息的基础信息,而子类Teacher有Teacher特有的putResources方法,学生有学生特有的doWork,doSelf,和play方法.对象之间没有直接的调用,而是通过调用接下来的Master类间接的实现对象之间的互调
3 调停者
3.1 接口 MediatorInterface
package demo;
/**
* @author 作者 Your-Name:Pxy
* @version 创建时间:2020年11月6日 下午7:47:32
* 类说明
*/
public interface MediatorInterface {
/**
* 调停的方法
* @param requestId 请求id ,放在日志中用于记录,一个requestId代表一个请求,
* @param requestPerson 请求发出方
* @param recivePerson 请求接收方
* 创建时间:2020年11月7日 下午12:06:30
*/
public void switchCall( Person requestPerson,Person recivePerson);
}
3.2 实现类:MasterJiImpl
package demo;
import java.util.HashMap;
import java.util.Map;
/**
* @author 作者 Your-Name:Pxy
* @version 创建时间:2020年11月6日 下午7:51:41
* 类说明
*/
public class MasterJiImpl implements MediatorInterface{
//打印日志用的一个标记
public static final String MediatorFlag = "[调停者处理请求]:";
//多态,子类引用指向父类 使参数更灵活
private Map<String,Object> personMap = new HashMap<String, Object>();
@Override
public void switchCall( Person requestPerson,Person recivePerson) {
System.out.println(MediatorFlag+":[----开始-----]");
System.out.println(MediatorFlag+":请求发出者:["+requestPerson.getName()+"].请求受理者:["+recivePerson.getName()+"]");
reciveRequest( requestPerson.getName(), recivePerson);
System.out.println(MediatorFlag+":[----完成-----]");
}
/**
* 根据请求接收方定位处理请求的方法
* @param requestId
* @param requestPerson
* @param recivePerson
* 创建时间:2020年11月7日 下午12:07:47
*/
private void reciveRequest( String requestName,Person recivePerson) {
System.out.println(MediatorFlag+":请求者为:["+requestName+"]");
System.out.println(MediatorFlag+":被请求者为:["+recivePerson.getName()+"]");
if(recivePerson instanceof Teacher){
System.out.println(MediatorFlag+":有人找老师要资源");
Teacher teacher = (Teacher)recivePerson;
Students students = (Students)personMap.get(requestName);
teacher.putResources( students);
}else if(recivePerson instanceof Students){
Students students = (Students)recivePerson;
Person person = (Person)personMap.get(requestName);
studentAction( person, students);
}
}
/**
* 当请求接收方式学生时,通过这个方法判断这个请求是需要学生干嘛
* @param requestId
* @param requestPerson
* @param students
* 创建时间:2020年11月7日 下午12:08:34
*/
private void studentAction(Person requestPerson,Students students){
if(requestPerson==null){
System.out.println(MediatorFlag+"[请求信息为空,你想干嘛不妨直说?]");
}else if(requestPerson instanceof Students){
if(requestPerson.getName().equals(students.getName())){
System.out.println(MediatorFlag+"学生自己完成任务");
students.doSelf(requestPerson.getMessage());
}else{
System.out.println(MediatorFlag+"学生们在一起玩耍");
students.play(requestPerson);
}
}else if(requestPerson instanceof Teacher){
System.out.println(MediatorFlag+":老师给学生布置作业");
students.doHomeWork(requestPerson);
}
}
/**
* 用来将人员信息添加至personMap中,供调停者调用
* @param person
* 创建时间:2020年11月7日 下午12:04:29
*/
public void addPerson(Person person){
personMap.put(person.getName(), person);
}
}
MasterJiImpl类实现了调停者接口中的switchCall方法,对任意发过来的请求进行处理和转发,实现person对象之间的调用,这几个类的结构图如下
4 演示
package com.sgcc.demo;
import java.util.UUID;
import org.junit.Test;
/**
* @author 作者 Your-Name:Pxy
* @version 创建时间:2020年11月7日 上午10:06:43
* 类说明
*/
public class MediatorDemo {
@Test
public void TestDemo() {
Teacher teacherPeng = new Teacher("彭老师", "男老师", "18");
Teacher teacherLiu = new Teacher("刘老师", "男老师", "18");
Students studentsLi = new Students("李同学","小女生","18");
Students studentsWang = new Students("王同学","小男孩","15");
Students studentsJi = new Students("纪同学","小女生女","18");
MasterJiImpl masterJiImpl = new MasterJiImpl();
masterJiImpl.addPerson(teacherPeng);
masterJiImpl.addPerson(teacherLiu);
masterJiImpl.addPerson(studentsLi);
masterJiImpl.addPerson(studentsWang);
masterJiImpl.addPerson(studentsJi);
String requestId = UUID.randomUUID().toString().replaceAll("-", "");
/*
* 彭老师给李同学布置作业,让她讲调停者模式
*/
// teacherPeng.setMessage("介绍调停者模式");
// masterJiImpl.switchCall(requestId, teacherPeng,studentsLi);
/*
* 李同学自己自学了工厂模式
*/
// studentsLi.setMessage("自学工厂模式");
// masterJiImpl.switchCall(requestId, studentsLi, studentsLi);
/*
* 李同学找纪同学吃米粉
*/
studentsLi.setMessage("快乐的吃米粉");
masterJiImpl.switchCall(studentsLi, studentsJi);
/*
* 李同学问刘老师要彭老师的电话
*/
// studentsLi.setMessage("彭老师的电话");
// masterJiImpl.switchCall(requestId, studentsLi, teacherLiu);
}
}
先定义2个老师对象,3个学生对象,通过MasterJiImpl的addPerson方法将5个对象添加到MasterJiImpl中的成员变量personMap中,再调用MasterJiImpl的switchCall方法实现对象间的调用,运行结果如下
5 总结
通过调停者模式可以有效的带来下面的几个有点
1.组件间的耦合度降低
2. 多对多的复杂模型变成一对多的简单模型
3. 组件间的交互集中控制
调停者模式使控制集中化,所有的交互行为都集中在调停者类中,但随着调停者类变的日益庞大,其维护成本会越来越大