中介者模式定义一个封装一组对象如何交互的对象(通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互)
结构
中介者模式的主要角色有:
- Mediator:抽象中介者,定义了同事对象到中介者对象之间的接口。
- ConcreteMediator:具体中介者,实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
- Colleague:抽象同事类, 它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
- ConcreteColleague:具体同事类,每个同事对象在与其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。
在中介者模式中中介者对象处于核心地位,因为它定义了整个系统中所有具体同事类之间的关系。在整个系统中它主要承担两个方面的责任:
- 结构上起到中转作用:通过中介者对象对关系的封装,使得具体的同事类不再需要显示的引用其他对象,它只需要通过中介者就可以完成与其他同事类之间的通信。
- 行为上起到协作作用:中介者对同事类之间的关系进行封装,同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。在这个过程中同事类是不需要指明中介者该如何做,中介者可以根据自身的逻辑来进行协调,对同事的请求进一步处理,将同事成员之间的关系行为进行分离和封装。
同时由于中介者对对象的关系进行了封装,使得各个同事类之间的耦合减少了,使得他们可以独立改变和复用。
优缺点
优点:
- 将一对多转化成了一对一、降低程序复杂度
- 类之间解耦
缺点:
- 中介者过多,导致系统复杂
代码实现
抽象中介类
interface Mediator {
/**
* 让对象之间通讯
* @param content 传递的内容
* @param person 传递的对象
*/
void contact(String content, AbstractPerson person);
}
抽象同事类AbstractPerson
abstract class AbstractPerson {
protected String name;
protected Mediator mediator;
AbstractPerson(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
public abstract void receiveMessage(String msg);
}
分别定义房东和租客类,继承抽象同事类
class HouseOwner extends AbstractPerson {
HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
public void contact(String message) {
mediator.contact(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("房主:" + name + ",获得信息:" + message);
}
}
class Tenant extends AbstractPerson {
Tenant(String name, Mediator mediator) {
super(name, mediator);
}
public void contact(String message) {
mediator.contact(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("租客:" + name + ",获得信息:" + message);
}
}
创建具体中介者,抽象的实现,用来协调各个同事之间调用
class MediatorStructure implements Mediator {
private HouseOwner houseOwner;
private Tenant tenant;
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, AbstractPerson person) {
//如果是房主,则租房者获得信息
if (person == houseOwner) {
tenant.receiveMessage(message);
} else {
//反正则是房主获得信息
houseOwner.receiveMessage(message);
}
}
}
测试类
public class Client {
public static void main(String[] args) {
//一个房主、一个租房者、一个中介机构
MediatorStructure mediator = new MediatorStructure();
HouseOwner owner = new HouseOwner("小唐", mediator);
Tenant tenant = new Tenant("小李", mediator);
mediator.setHouseOwner(owner);
mediator.setTenant(tenant);
tenant.contact("房东您好,请问还有三室两厅出粗吗.....");
owner.contact("还有!你需要租吗?");
}
}
控制台输出
房主:小唐,获得信息:房东您好,请问还有三室两厅出粗吗.....
租客:小李,获得信息:还有!你需要租吗?