中介者模式(Mediator Pattern),定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为,属于行为型模式。
其主要的目的是用来降低多个对象和类之间的通信复杂性。
简单的来说就是提供一个平台。比如生活中我们经常用到的聊天软件QQ、微信群,或者是上网购物的网站淘宝、京东,又或者是房产中介。但是无论是QQ群,还是房产中介,他们都是充当一个中间平台的作用,我们可以直接通过这个平台得到我们想要的信息,避免了独自获取花费的成本。
中介者模式主要由这四个角色组成, 抽象中介者(Mediator)、具体中介者(ConcreteMediator)、 抽象同事类(Colleague)和具体同事类(ConcreteColleague) 。
这里为了方便理解,我们使用一个简单的示例来加以说明。
xuwujing创建了一个Java的QQ群,并邀请了很多人进来,其中张三也加进来了,进群之后,大家开始互相打招呼进行交流。。。
那么我们便可以根据这个简单的例子来使用中介者模式进行开发。
首先依旧定义一个抽象的中介者,就是QQ群,可以进行交流;然后再定义一个抽象的同事类,可以谈话。
那么这个抽象类的代码如下:
interface QQqun {
void exchange(Person person,String message);
}
abstract class Person{
protected String name;
protected QQqun qun;
Person(String name,QQqun qun){
this.name = name;
this.qun = qun;
}
}
定义好该抽象类之后,我们再来定义具体的同事类,也就是xuwujing和张三,可以进行交流。
那么代码如下:
class ZhangSan extends Person{
ZhangSan(String name, QQqun qun) {
super(name, qun);
}
void exchange(String message){
qun.exchange(this,message);
}
void talk(String message){
System.out.println(name +"说:" + message);
}
}
class XuWuJing extends Person{
XuWuJing(String name, QQqun qun) {
super(name, qun);
}
void exchange(String message){
qun.exchange(this,message);
}
void talk(String message){
System.out.println(name +"回应:" + message);
}
}
最后再来定义具体中介者对象,这个QQ群的具体实现。
代码如下:
class JavaQQqun implements QQqun{
private ZhangSan zs;
private XuWuJing xwj;
public ZhangSan getZs() {
return zs;
}
public void setZs(ZhangSan zs) {
this.zs = zs;
}
public XuWuJing getXwj() {
return xwj;
}
public void setXwj(XuWuJing xwj) {
this.xwj = xwj;
}
@Override
public void exchange(Person person, String message) {
if(zs.equals(person)){
zs.talk(message);
}else if(xwj.equals(person)){
xwj.talk(message);
}
}
}
最后再来进行测试,定义好交流平台以及需要交流的人员。
那么测试代码如下:
public static void main(String[] args) {
JavaQQqun jq = new JavaQQqun();
ZhangSan zs = new ZhangSan("张三", jq);
XuWuJing xwj = new XuWuJing("xuwujing", jq);
jq.setZs(zs);
jq.setXwj(xwj);
zs.exchange("大家好!我是张三!");
xwj.exchange("欢迎你!张三!");
}
输出结果:
张三说:大家好!我是张三
xuwujing回应:欢迎你!张三!
中介者模式优点:
灵活性高,因为将同事类进行了解耦,使其不必有关联性;
降低了类的复杂度,将一对多转化成了一对一;
中介者模式缺点:
中介者使用过多,会使系统变得复杂难以维护;
使用场景:
通过一个中间类来封装多个类中的行为,而又不想生成太多的子类
注意事项:
若不明确各个类的职责,那么就不要进行使用!
和外观模式、代理模式比较
中介者模式和外观模式、代理模式比较类似,但是又有不同。
和外观模式比较,中介者模式中,同事类必须依赖与中介者,中介者也知道同事类;但是外观模式中,子系统是不需要知道外观类的存在,并且子系统是可以脱离外观模式的。
和代理模式,代理模式的核心就是代理作用,主要还是对原先的类进行扩展或增加控制,比如进行权限控制;而中介者模式主要目的是为了减少对象之前的耦合,也就是同事类直接相互独立,互不影响。
参考文章:https://www.cnblogs.com/xuwujing/p/9911997.html