中介者模式:用一个中介对象封装一些列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
举例:在一个公司里面,有很多部门、员工,为了完成一定的任务,“同事”之间肯定有许多需要互相配合、交流的过程。如果由各个“同事”频繁地到处去与自己有关的“同事”沟通,这样肯定会形成一个多对多的杂乱的联系网络而造成工作效率低下。此时就需要一位专门的“中介者”给各个“同事”分配任务,以及统一跟进大家的进度并在“同事”之间实时地进行交互,保证“同事”之间必须的沟通交流。很明显我们知道此时的“中介者”担任了沟通“同事”彼此之间的重要角色了,“中介者”使得每个“同事”都变成一对一的联系方式,减轻了每个“同事”的负担,增强工作效率。
所以中介者模式适用场景:
1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。
中介者就是一个处于众多对象,并恰当地处理众多对象之间相互之间的联系的角色。
package com.qinsoft.design; import java.util.ArrayList; import java.util.List; /** * 中介者模式:行为型 */ public class Mediator { public static void main(String[] args) { Tertium mediator = new Tertium(); Workman trac = new Workman("wesen",mediator); Workman mali = new Workman("mali",mediator); mediator.add(trac); mediator.add(mali); mediator.order("have a rest!"); mediator.clear(); } } class Workman { private String name; private Tertium mediator; //构造函数必把把中介者注入 public Workman(String name, Tertium mediator) { this.name = name; this.mediator = mediator; } //业务动作,相互通信息动作 public void getOrder(String orders) { System.out.println(this.name + "," + orders); } } /** * 中介者 */ class Tertium { //提供参与者list,把参与通信的对象注册进来,注册动作也可放进参与者对象当中 private List<Workman> works = new ArrayList<Workman>(); public void add(Workman workman) { works.add(workman); } public void clear() { works.clear(); } //统一通信动作通过中介 public void order(String orders) { for(Workman m : works) { m.getOrder(orders); } } }
在结构上,中介者模式与观察者模式、命令模式都添加了中间对象——只是中介者去掉了后两者在行为上的方向。因此中介者的应用可以仿照后两者的例子去写。但是观察者模式、命令模式中的观察者、命令都是被客户所知的,具体哪个观察者、命令的应用都是由客户来指定的;而大多中介者角色对于客户程序却是透明的。当然造成这种区别的原因是由于它们要达到的目的不同。
从目的上看,中介者模式与观察者模式、命令模式便没有了任何关系,倒是与外观模式有些相似。但是外观模式是介于客户程序与子系统之间的,而中介者模式是介于子系统与子系统之间的。这也注定了它们有很大的区别:外观模式是将原有的复杂逻辑提取到一个统一的接口,简化客户对逻辑的使用。它是被客户所感知的,而原有的复杂逻辑则被隐藏了起来。而中介者模式的加入并没有改变客户原有的使用习惯,它是隐藏在原有逻辑后面的,使得代码逻辑更加清晰可用。