设计模式之中介者模式
中介者模式的简单介绍
说到中介,我们是比较熟悉的,比如去留学,有专门的中介负责,买房子,有专门的中介负责。有中介的好处在于,我们不需要直接跟目标对象接触,也就是说,我们之间的交流可以通过中介来完成即可,这样子的好处在于,我们之间的联系不需要很紧密,特别是当涉及到的对象比较多的时候,如果对象与对象之间直接进行交互,整个关系就会变得比较复杂了。中介者模式(Mediator)就是基于这样的情形所提出来的,对象之间的交互都通过中介者来完成,这样,对象与对象之间的联系就变得比较弱了,当对象发生变化的时候,这种关系也就是不至于变得太难以处理。
中介者模式的具体实现
这里,我们通过一个简单的购房模型来实现中介者模式,以便更好地理解中介者模式
/**
* 中介者类
*/
public class Mediator {
// 包含多种不同类型的用户:销售者以及购买者
private List<HouseProvider> houseProviders = new ArrayList<>();
private List<Client> clients = new ArrayList<>();
public void register(HouseProvider houseProvider){
houseProviders.add(houseProvider);
}
public void addClient(Client client){
clients.add(client);
}
// 出售房子
public void sellingHouse(String providerName, Client client){
for (HouseProvider houseProvider : houseProviders){
if (houseProvider.getName().equals(providerName)){
houseProvider.sellHouse();
client.reply("yes");
return;
}
}
client.reply("no");
}
}
/**
* 房屋出售者
*/
abstract class HouseProvider{
protected Mediator mediator;
protected String name;
public String getName() {
return name;
}
public HouseProvider(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
mediator.register(this);
}
public abstract void sellHouse();
}
class HouseProviderOne extends HouseProvider{
public HouseProviderOne(Mediator mediator, String name) {
super(mediator, name);
}
@Override
public void sellHouse() {
System.out.printf("%s selling house\n", name);
}
}
class HouseProviderTwo extends HouseProvider{
public HouseProviderTwo(Mediator mediator, String name) {
super(mediator, name);
}
@Override
public void sellHouse() {
System.out.printf("%s selling house\n", name);
}
}
/**
* 客户
*/
class Client{
private Mediator mediator;
private String name;
public Client(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
mediator.addClient(this);
}
public void buyHouse(String providerName){
System.out.printf("Do you selling house %s\n",providerName);
mediator.sellingHouse(providerName, this);
}
public void reply(String msg){
System.out.printf("Get the reply %s\n", msg);
}
}
从上面可以看到,客户类并没有直接跟出售房屋的类直接交互,而是通过中介者来进行协调,这样子的好处在于,客户不需要直接跟出售者进行交互,关于出售者的很多信息客户并不需要知道,反过来也是同理。
总结
中介者模式,主要用于关系比较复杂的系统中进行关系的解耦,将网状的关系网拆解成由中介者进行协调的星型结构,好处是降低了各个对象之间的耦合度,不过也带来了对应的问题,中介者所需要处理的事情比较多。