1 定义
中介者模式(Mediator Pattern)又叫调停者模式,属于行为型设计模式,它主要用于降低对象间交互的依赖和通讯复杂性,提供了一个中介的角色来封装处理对象间的通讯,将原来多个对象间网状的通讯行为(多个对象相互通讯)改变成为星型通讯行为(每个对象只跟中介交互,中介者再转达),从而达到松耦合效果。例如现实买卖房子双方和房产中介之间的交互,一般情况买方和卖方不直接进行交易,而是通过房产经纪进行信息或者物质的传递。
2 基本实现
中介者模式一般包含4个角色,分别是:
- 抽象中介(Mediator):用于定义同事对象和中介者对象的接口。例如上述定义举例的中介。
- 具体中介(ConcreteMediator):具体中介者类,它实现了抽象中介的方法,并且持有所有具体同事类对象以及负责具体同事接收消息和再向另外具体同事对象发出命令。例如上述定义举例的房产经纪。
- 抽象同事(Colleague):用于定义同事的行为和中介对象的持有。例如上述定义举例的买卖双方。
- 具体同事(ConcreteColleague):具体同事对象类,它实现抽象同事的方法,也就是实现具体行为和继承其中介对象的持有,每个具体同事只关心自己的行为,而不了解其它同事类的情况。例如上述定义举例的具体买家和卖家,他们不关心对向的详细行为,但他们都认识房产经纪。
抽象中介类,只定义一个转达的行为方法:
public abstract class Mediator {
abstract void relay(People colleague, String msg);
}
具体中介类,它内部持有买卖双方同事对象,并且根据接收对象来转达消息:
public class RealEstateMediator extends Mediator {
private People mBuyer;
private People mSeller;
public void setPeople(People buyer, People seller) {
mBuyer = buyer;
mBuyer.setMediator(this);
mSeller = seller;
mSeller.setMediator(this);
}
@Override
public void relay(People colleague, String msg) {
System.out.println("房产经纪转达");
if (colleague.equals(mBuyer)) {
mSeller.receive(msg);
} else if (colleague.equals(mSeller)) {
mBuyer.receive(msg);
}
}
}
抽象同事类,所有同事都应该认识中介,所以持有中介对象,和定义了同事间的行为:
public abstract class People {
protected Mediator mMediator;
public void setMediator(Mediator mediator) {
mMediator = mediator;
}
public abstract void receive(String msg);
public abstract void give(String msg);
}
具体同事,也就是买家和卖家,他们各自只关心自己付出什么和收到什么:
public class Buyer extends People {
@Override
public void receive(String msg) {
System.out.println("买家收到:" + msg);
}
@Override
public void give(String msg) {
System.out.println("买家付出:" + msg);
mMediator.relay(this, msg);
}
}
public class Seller extends People {
@Override
public void receive(String msg) {
System.out.println("卖家收到:" + msg);
}
@Override
public void give(String msg) {
System.out.println("卖家付出:" + msg);
mMediator.relay(this, msg);
}
}
客户端:
public class Main {
public static void main(String[] args) {
RealEstateMediator mediator = new RealEstateMediator();
People buyer = new Buyer();
People seller = new Seller();
mediator.setPeople(buyer, seller);
buyer.give("500万");
seller.give("房子一套");
}
}
输出结果:
买家付出:500万
房产经纪转达
卖家收到:500万
卖家付出:房子一套
房产经纪转达
买家收到:房子一套
3 区别
代理模式、中介模式、命令模式三者区别:
- 代理模式是结构型,解决对象不适合直接引用另一对象而通过代理类作桥梁连接,代理还可增加额外的功能扩展。
- 中介模式是行为型,降低多个对象间交互的依赖和通讯复杂性,将原多对象间的网状通讯变成星型通讯。
- 命令模式是行为型,避免了请求者与接收者的直接调用,通过一系列命令传递工作逻辑。
4 总结
中介者模式一般用于多个对象间需要进行复杂相互通讯的场景时通过使用一个定制的中介类来封装多个类的行为,中介角色的出现减少了各个对象明间的耦合,使得可以独立地改变和复用。同时要注意的是,由于把原来属于同事对象间的交互复杂性转交到中介角色中去进行封装,中介者承担的责任也变多,所以这也使用中介者变得比任何一个同事对象都复杂,而且如果往后需要增加同事类时,也不得不去修改中介者。