什么是中介者模式
中介者模式是一种对象行为型模式。
中介者模式是使用一个中介者对象来封装对象之间的调用关系,使对象之间不需要显示的相互引用,从而降低了对象之间的耦合度,并且可以独立地改变它们之间的交互。
看了上面的简介,如果你是一个Java开发者,瞬间回想起一个技术词汇IOC。
中介者模式其实就是将对象之间错综复杂的调用关系,揽在自己手里,通过中介者缕清,对象不需要考虑被调用对象,完全安安信息的做自己。
如果码农的饭碗中的一部分——主板,不工作了,会造成什么影响?电脑启动不起来,即使起来了可能无限蓝屏。所以主板在计算机中,属于非常重要的一环,它连通了显卡、显示器、CPU等等。
这就是一个中介者。
中介者模式是迪米特法则的典型应用。
核心结构
- Mediator。抽象中介者,声明交互方法,用于调停同事类之间的调用关系。
- ConcreteMediator。具体中介者,实现了抽象中介者中的方法,并且维持了各个同事对象之间的引用。
- Colleague。抽象同事类,声明具体同事类扩展的方法,并且定义了一些具体同事类公有的方法,并且维持了一个抽象中介者对象的引用,具体同事类可以根据这个引用完成相互调用。
- ConcreteColleague,具体同事类,实现或重写抽象同事类的方法,并通过引用与其他具体同事类进行交互。
类图展示
代码分析
作为北漂,几乎每年都会经历一次痛不欲生的经历——找房子,各种真假难辨的中介信息。而租房,房东,中介者,三个角色就形成了典型的中介者模式。
我们就以此例来实现中介者模式。
首先我们需要定义抽象同事类——人:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
* 中介者模式——抽象同事
*/
public abstract class Person {
protected Mediator mediator;
protected String name;
protected String message;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public abstract void lease(String request);
public abstract void looking(String request);
}
接着我们实现两种具体同事类。
房东:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
*/
public class Landlord extends Person {
@Override
public void lease(String request) {
this.mediator.notification(request);
}
@Override
public void looking(String request) {
this.message = request;
}
}
租客:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
*/
public class Tenant extends Person {
@Override
public void lease(String request) {
}
@Override
public void looking(String request) {
this.message = request;
}
}
接下来就是核心结构——中介者。
抽象中介者——代表所有的中介者的基本能力:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
* 中介者模式——抽象中介
*/
public abstract class Mediator {
protected List<Person> personList = new ArrayList<Person>();
public void register(Person person) {
personList.add(person);
person.setMediator(this);
}
public abstract void notification(String request);
}
接下来就是一个一个的中介者——具体中介者:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/29.
*/
public class HomeChain extends Mediator {
@Override
public void notification(String request) {
System.out.println("Matching...");
for (Person person : personList) {
if ((null != person.getMessage()) && (person.getMessage().contains(request))) {
System.out.println("Dear " + person.getName() + ", a quality housing is meeting your requirements, the address has already send to your telephone.");
}
}
}
}
惯例,测试代码:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/6/22.
* 中介者模式测试
*/
public class MediatorTest {
public static void main(String[] args) {
Mediator mediator = new HomeChain();
Person landlord = new Landlord();
Person tenantOne = new Tenant();
Person tenantTwo = new Tenant();
Person tenantThree = new Tenant();
mediator.register(tenantOne);
mediator.register(tenantTwo);
mediator.register(tenantThree);
tenantOne.setName("Tenant One");
tenantOne.setMediator(mediator);
tenantOne.looking("the Tomorrow Community");
tenantTwo.setName("Tenant Two");
tenantTwo.setMediator(mediator);
tenantTwo.looking("the Century Cmmunity");
tenantThree.setName("Tenant Three");
tenantThree.setMediator(mediator);
tenantThree.looking("the Country Garden");
landlord.setName("Ghost");
landlord.setMediator(mediator);
landlord.lease("the");
}
}
模式总结
优点
- 简化了对象之间的交互。由之前的对象之间多对多关系,变为现在中介者对对象的一对多的关系。
- 降低了对象之间的耦合度。对象之间不需要直接相互引用,而是统一到中介者进行操盘,对象的变更不会对间接的引用方造成影响。
- 减少子类的产生。对象调用时无需产生过多的同事类,只需声明一个新的具体中介类即可。
缺点
- 中介者角比较复杂,增加了系统设计的难度。
适用场景
- 重构,对象之间的关系错综复杂,动一动就牵一发而动全身。
- 想通过一个类来管理各个对象,去掉不必要的子类。