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


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种设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值