中介者模式
Mediator Pattern:中介者模式,属于GoF23种设计模式中属于行为型模式的一种。
中介者模式,顾名思义,就是有一个中介的意思,和我们现实生活中的什么房屋中介啊,出国留学的中介啊是一个意思,又或者高大上一点的联合国也是充当着一个中介者的角色。
中介者模式呢,就是用一个中介来封装其他所有对象的交互,让对象之间不会直接进行显示的相互调用,而是通过中介对象完成,达到的目的就是减低多个对象交互的复杂性。
结构
结合类图简单分析一下,中介者模式一共有四个对象:
- 抽象中介者角色:定义对象到中介者之间的接口
- 具体中介者角色:实现抽象中介者的接口方法,同时呢,还需要直到所有的具体对象,因为它需要从这些具体对象之中接收他们发出的请求,并且找到对应的对应解决处理这个请求。
- 抽象对象角色:额,这就是一个抽象,用于扩展来着的
- 具体对象角色:每个具体对象仅仅只能直到自己的一切,是并不会了解其他的具体对象的,它们之间的交流交互需要的是中介者对象来帮忙。
举例
- 中介嘛,这个在现实生活中已经有很多了,买房的中介,租房的中介,出国留学的中介,上辅导班的中介等等,等等,只有你想不到的,没有不存在的,哈哈哈
- 嗯,贴近技术一点的就是MVC三层设计模式了,其中的控制层就是类似一个中介角色,用于模型层和视图层两者之间的交互,起到的作用是解耦合。
注意
-
中介者模式可以说是迪米特原则的突出说明,迪米特原则呢也叫做最少知识原则,具体就是说一个对象应该对其他的对象尽可能少的了解。
翻译过来就是:不要和陌生人说话哟~~ 不要搭理陌生人哦~~
-
用于中介者承担着对于所有对象交互的维护,所以中介者一般是很负责和庞大的,使用的时候需要小心再小心,仔细再仔细。
-
使用中介者模式的情况,一般是具体的对象都已经确定了的情况下,对象之间有着复杂的交互的状态下使用中介者模式会使得程序变的简单一些。
一个小DEMO
-
场景
联合国就是一个巨型的庞大的中介者对象,为世界上各个国家之间的问题解决,比方说这个国家和那个国家打仗啊就需要去调停,比如说这个国家哪个国家需要发展啊就需要提供支援等等等等。
-
对象首先需要明确
/** * 中介者模式——抽象对象类 * @author wq */ public abstract class AObject { // 保存一个中介者对象 protected Mediator mediator; public AObject(Mediator mediator) { this.mediator = mediator; } public void send(String message) { mediator.sendMessage(message, this); } public abstract void doSomething(String message); }
-
具体的对象
/** * 中介者模式——具体对象类 * A 国 * @author wq */ public class A extends AObject{ public A(Mediator mediator) { super(mediator); } @Override public void doSomething(String message) { System.out.println("A---->" + message); } } //------------------------------------------------------------------ /** * 中介者模式——具体对象类 * B 国 * @author wq */ public class B extends AObject{ public B(Mediator mediator) { super(mediator); // TODO Auto-generated constructor stub } @Override public void doSomething(String message) { System.out.println("B---->" + message); } }
-
抽象中介者
/** * 中介者模式——抽象中介类 * @author wq */ public interface Mediator { // 发送指定的消息给指定的对象进行处理 void sendMessage(String message, AObject aObject); }
-
联合国
/** * 中介者模式——具体中介类 * the United Nations 联合国 * @author wq */ public class UN implements Mediator{ // 中介者必须知道所有的具体对象 private A a; private B b; public void setA(A a) { this.a = a; } public void setB(B b) { this.b = b; } @Override public void sendMessage(String message, AObject aObject) { // 根据传递过来的具体对象做出判断操作 if (aObject instanceof A) { System.out.println("A国发出的消息,B国获得消息"); b.doSomething(message); } else { System.out.println("B国发出的消息,A国获得消息"); a.doSomething(message); } } }
-
测试类
/** * 中介者模式——测试类 * @author wq */ public class Main { public static void main(String[] args) { // 联合国 UN un = new UN(); // 具体对象 A a = new A(un); B b = new B(un); // 中介管理所有具体对象 un.setA(a); un.setB(b); // 消息仅有中介来一波 a.send("我是A"); b.send("我是B"); } }
-
测试
A国发出的消息,B国获得消息 B---->我是A B国发出的消息,A国获得消息 A---->我是B