中介者模式定义了一系列对象间的交互方式,使得这些对象相互作用而又不耦合在一起。
“网状结构”,要求每个对象都必须知道它需要交互的对象。把这种“网状结构”改为“星形结构”的话,将大大降低它们之间的“耦合性”,这时只要找一个“中介者”就可以了。例如:
-
每个人必须记住他(她)所有朋友的电话;而且,朋友中如果有人的电话修改了,他(她)必须让其他所有的朋友一起修改。只要在网上建立一个每个朋友都可以访问的“通信录”就解决了。
-
想租房,可以找“房屋中介”;
-
找工作,可以找“人才交流中心”帮忙。
-
在 MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者;
-
QQ 聊天程序的“中介者”是 QQ 服务器。
应用场景
-
当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
-
当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
-
当对象间有很多的交互操作,而且一个对象的行为依赖于其他对象时,可以利用中介者模式解决紧耦合的问题。

中介者模式包含以下主要角色。
-
抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发(relay)同事对象信息的抽象方法。
-
具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
-
抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
-
具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
public class MediatorPattern {
public static void main(String[] args) {
Mediator md = new ConcreteMediator();
Colleague c1, c2;
c1 = new ConcreteColleague1();
c2 = new ConcreteColleague2();
md.register(c1);
md.register(c2);
c1.send();
System.out.println("-------------");
c2.send();
}
}
//抽象中介者
abstract class Mediator {
public abstract void register(Colleague colleague);
public abstract void relay(Colleague cl); //转发
}
//具体中介者
class ConcreteMediator extends Mediator {
private List<Colleague> colleagues = new ArrayList<Colleague>();
public void register(Colleague colleague) {
if (!colleagues.contains(colleague)) {
colleagues.add(colleague);
colleague.setMedium(this);
}
}
public void relay(Colleague cl) {
for (Colleague ob : colleagues) {
if (!ob.equals(cl)) {
((Colleague) ob).receive();
}
}
}
}
//抽象同事类
abstract class Colleague {
protected Mediator mediator;
public void setMedium(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive();
public abstract void send();
}
//具体同事类
class ConcreteColleague1 extends Colleague {
public void receive() {
System.out.println("具体同事类1收到请求。");
}
public void send() {
System.out.println("具体同事类1发出请求。");
mediator.relay(this); //请中介者转发
}
}
//具体同事类
class ConcreteColleague2 extends Colleague {
public void receive() {
System.out.println("具体同事类2收到请求。");
}
public void send() {
System.out.println("具体同事类2发出请求。");
mediator.relay(this); //请中介者转发
}
}


模式的扩展
-
在实际开发中,通常采用以下两种方法来简化中介者模式,使开发变得更简单。不定义中介者接口,把具体中介者对象实现成为单例。
-
同事对象不持有中介者,而是在需要的时候直接获取中介者对象并调用。

中介者模式在JDK源码中体现

不论是什么样的任务加入到队列中,我们都把这个队列中的对象称为“同事”。查看 sched() 方法的源码可以看出,所有的任务(task)都放到了 Timer 类维护的 task 队列中,同事之间的通信都是通过 Timer 来协调完成的,所以,Timer 承担了中介者的角色,而 task 队列内的任务就是具体同事对象。
JDK:Timer 对 TimerTask 是一对多,可以有外界各个 task 统一管理。
Android:
如Resource.getDrawable方法的实现逻辑是这样的:创建一个缓存来存放所有已经加载过的,如果getDrawable中传入的id所对应的Drawable以前没有被加载过,那么它就会根据id所对应的资源类型,分别调用XML解析器生成,或者通过读取包中的图片资源文件来创建Drawable。
而Resource.getDrawable把涉及到多个对象、多个逻辑的操作封装成一个方法,就实现了一个调解者的角色。
根据以下文章总结:
-
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/
-
设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html
-
java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html
-
设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html
-
设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html
-
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
-
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html
中介者模式通过集中管理对象间的交互,降低了系统的耦合度,使得复杂的关系网转变为星形结构。在Java设计中,如JDK的Timer类就是一种中介者实现,协调任务的调度。在Android系统编程中,Resource.getDrawable方法也体现了中介者模式,统一处理资源加载。该模式在实际开发中可以通过简化实现,如不定义中介者接口或动态获取中介者。关键词涉及设计模式、中介者、耦合性、系统架构、Java、Android。
884

被折叠的 条评论
为什么被折叠?



