中介者模式(Mediator Pattern):
是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
使用之后的模式:
中介者模式包含以下主要角色:
抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
租房子案例:
Mediator是抽象中介者,定义了同事对象列表中介者对象的接口;
package com.zhongjiezhe3;
//它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法
public abstract class Mediator {
//定义抽象中介的抽象方法
public abstract void contact(String message,Person person);
}
ConcreteJg是具体中介者对象,实现抽象类的方法,它需要知道所有的具体同事类,并且从具体同事类接受消息,向具体同事类发出命令;
package com.zhongjiezhe3;
//实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
public class MediatorJg extends Mediator{
//中介机构只知道租客和房东
private HouseOwner houseowner;
private Tenant tenant;
public MediatorJg() {
super();
}
public MediatorJg(HouseOwner houseowner, Tenant tenant) {
super();
this.houseowner = houseowner;
this.tenant = tenant;
}
//get/set方法
public HouseOwner getHouseowner() {
return houseowner;
}
public void setHouseowner(HouseOwner houseowner) {
this.houseowner = houseowner;
}
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
//重写继承抽象中介者类方法
@Override
public void contact(String message, Person person) {
if(person==houseowner) {
this.houseowner.getMessage(message);
}else {
this.tenant.getMessage(message);
}
}
}
Person叫做抽象同事类;
package com.zhongjiezhe3;
//定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,
//实现所有相互影响的同事类的公共功能。
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
super();
this.name = name;
this.mediator = mediator;
}
}
HouseOwner是具体同事类,每个具体的同事只知道自己的行为,而不了解其他同事类的情况,但是它们却都认识中介者对象;
package com.zhongjiezhe3;
public class HouseOwner extends Person {
//全参构造方法
public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
//房东与中介者联系的方法
public void contact(String message) {
this.mediator.contact(message,this);
}
//房东获取信息的方法
public void getMessage(String message) {
System.out.println(this.name+"获得信息:"+message);
}
}
Tenant是具体同事类,每个具体的同事只知道自己的行为,而不了解其他同事类的情况,但是它们却都认识中介者对象;
package com.zhongjiezhe3;
public class Tenant extends Person {
//全参构造方法
public Tenant(String name, Mediator mediator) {
super(name, mediator);
}
//租客与中介者联系的方法
public void contact(String message) {
this.mediator.contact(message,this);
}
//租客获取信息的方法
public void getMessage(String message) {
System.out.println(this.name+"获得消息:"+message);
}
}
客户端测试类
package com.zhongjiezhe3;
public class Test {
public static void main(String[] args) {
//创建中介者对象
MediatorJg mediator =new MediatorJg();
//创建房东对象,房东只需要知道中介
HouseOwner houseowner=new HouseOwner("小李",mediator);
//创建租客对象,租客也只需要知道中介
Tenant tenant =new Tenant("老王",mediator);
//中介需要知道房主和租客
mediator.setTenant(tenant);
mediator.setHouseowner(houseowner);
//承租者与中介联系
tenant.contact("我需要租三室一厅的房子");
//房主与中介联系
houseowner.contact("我这里有三室一厅的房子,你要租吗?");
}
}
运行结果
应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点:中介者会庞大,变得复杂难以维护。
使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项:不应当在职责混乱的时候使用。