在我们的日常生活中经常需要购买各种各样的东西,房子、车子、生活用品等等。那么我们并不会对各个产品都了解,所以销售人员应运而生,他们了解产品,然后他们根据你的需求在向你们推荐符合你们要求的产品。这些销售人员就相当于中介,处于客户和产品之间,为你们搭桥牵线。这就是这篇需要讲述的一个设计模式-中介者模式。
介绍
从程序方面来讲,中介者模式就是各个对象封装,使他们不需要相互直接引用,而是通过中介者来通信。对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。
如下图(图片来自大话设计模式)
联合国就相当于中介者模式中的中介者
结构图
案例
中介抽象类
public abstract class Mediator {
public abstract void handleMsg(String msg,Colleague colleague);
}
抽象同事类
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void getMsg(String msg);
public abstract void sendMsg(String msg);
}
房东类(具体同事类)
public class Landlord extends Colleague {
public Landlord(Mediator mediator) {
super(mediator);
}
@Override
public void getMsg(String msg) {
System.out.println("我是一名房东,今天我收到一条消息:"+msg);
}
@Override
public void sendMsg(String msg) {
mediator.handleMsg(msg, this);
}
}
租客类(具体同事类)
public class Renter extends Colleague {
public Renter(Mediator mediator) {
super(mediator);
}
@Override
public void getMsg(String msg) {
System.out.println("我是一名租客,今天我收到一条消息:"+msg);
}
@Override
public void sendMsg(String msg) {
mediator.handleMsg(msg, this);
}
}
房地产经纪人中介类
public class Realtor extends Mediator {
private Landlord landlord;
private Renter renter;
public void setLandlord(Landlord landlord) {
this.landlord = landlord;
}
public void setRenter(Renter renter) {
this.renter = renter;
}
@Override
public void handleMsg(String msg, Colleague colleague) {
//如果消息是房东发过来的,那就转给租客,让租客知道有人出租房屋
if (colleague.equals(landlord)) {
renter.getMsg(msg);
}
//如果消息是租客发过来的,说明租客已经决定是否租赁房屋,把消息给房东(现实中没这必要。。。)
if (colleague.equals(renter)) {
landlord.getMsg(msg);
}
}
}
测试类
public class Client {
public static void main(String[] args) {
//中介
Realtor realtor = new Realtor();
//房东和租客同时找上了中介
Landlord landlord = new Landlord(realtor);
Renter renter = new Renter(realtor);
realtor.setLandlord(landlord);
realtor.setRenter(renter);
landlord.sendMsg("有一套海景别墅要出租!!!");
renter.sendMsg("太贵,租不起!");
}
}
代码见Github地址
总结
如果在一个系统中对象之间的联系呈现为网状结构,也就是存在大量的多对多联系时就可以用中介者模式。通过使用中介者模式可以把原来的网状结构变成星形结构,最上面那两张图,联合国来作为中介,处理各国的事务。
中介者模式可以使对象之间的关系数量急剧减少,而且还承担这两方面的作用,一是中转作用,而是协调作用。通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。
通过使用中介者模式可以降低了类的复杂度,将一对多转化成了一对一,降低系统的耦合性。