Java 设计模式——中介者模式(行为型设计模式)

简介

中介者模式(Mediator Pattern),定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为,属于行为型模式。
其主要的目的是用来降低多个对象和类之间的通信复杂性。

简单的来说就是提供一个平台。比如生活中我们经常用到的聊天软件QQ、微信群,或者是上网购物的网站淘宝、京东,又或者是房产中介。但是无论是QQ群,还是房产中介,他们都是充当一个中间平台的作用,我们可以直接通过这个平台得到我们想要的信息,避免了独自获取花费的成本。

角色

中介者模式主要由这四个角色组成, 抽象中介者(Mediator)、具体中介者(ConcreteMediator)、 抽象同事类(Colleague)和具体同事类(ConcreteColleague) 。

  • 抽象中介者(Mediator): 定义了同事对象到中介者对象之间的接口。
  • 具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从 具体的同事类那里接收信息,并且向具体的同事类发送信息。
  • 抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
  • 具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

示例图如下:
Java 设计模式——中介者模式(行为型设计模式)_第1张图片

代码

这里为了方便理解,我们使用一个简单的示例来加以说明。
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

你可能感兴趣的:(JAVA设计模式,java,中介者模式,开发语言)