中介者模式本质:
解耦各个同事对象之间的交互关系,每个对象都持有中介对象的引用,只跟中介者对象打交道,我们通过中介者对象来统一管理这些交互关系。(同事对象是指在系统中,如果对象之间的联系呈网状结构,对象之间存在大量多对多的关系,我们称之为同事对象)
中介者模式优点:
1.降低了类的复杂度,将一对多,转化称为了一对一。
2.符合迪米特法则(一个对象应当对其它对象保持最少的了解)。
中介者模式缺点:
1.中介者会变得越来越臃肿,庞大。
中介者模式角色:
1.抽象同事角色:它可能是一个抽象类或者一个接口,它抽象出同事角色的业务行为。
2.具体同事角色:它实现了抽象同事角色的方法,具体化抽象同事角色的业务行为。
3.抽象中介者角色:它可能是一个抽象类或者接口,它抽象出中介者的业务行为。
4.具体中介者角色:它实现了抽象中介者角色的方法,具体化抽象中介者角色的业务行为。
下面我们以租房者,中介者,房东为例,带你了解中介者模式:
/**
*抽象同事角色
* Created by Administrator
*/
public interface BuyerAndSeller {
public void selfAction();
public void getAction();
}
/**
*具体同事角色(租房者)
* Created by Administrator
*/
public class Tenant implements BuyerAndSeller {
private Mediator mediator;
public Tenant(Mediator mediator) {
this.mediator = mediator;
this.mediator.register("tenant",Tenant.this);
}
@Override
public void selfAction() {
Log.d("selfAction","我是租房者,我想租房子");
}
@Override
public void getAction() {
Log.d("selfAction","我((租房者)不直接找房东,我先找中介,中介找房东");
mediator.doAction("landlord");
}
}
/**
*具体同事角色(房东)
* Created by Administrator
*/
public class Landlord implements BuyerAndSeller{
private Mediator mediator;
public Landlord(Mediator mediator) {
this.mediator = mediator;
this.mediator.register("landlord",Landlord.this);
}
@Override
public void selfAction() {
Log.d("selfAction","我是房东,我要把房子租出去");
}
@Override
public void getAction() {
Log.d("selfAction","我(房东)不直接找住房者,我先找中介,中介找租房者");
this.mediator.doAction("tenant");
}
}
/**
* 抽象的中介者
* Created by Administrator
*/
public interface Mediator {
void register(String name,BuyerAndSeller buyerAndSeller);
void doAction(String name);
}
/**
*具体中介者角色
* Created by Administrator
*/
public class MediatorImpl implements Mediator {
Map<String,BuyerAndSeller> hashMap=new HashMap<String,BuyerAndSeller>();
//你们租房者和房东都找我,那就先在我这里注册,然后有需求,我才能找到你们。
@Override
public void register(String name, BuyerAndSeller buyerAndSeller) {
hashMap.put(name,buyerAndSeller);
}
@Override
public void doAction(String name) {
hashMap.get(name).selfAction();
}
}
//实例化中介者角色(三个角色都是面向接口编程)
Mediator mediator=new MediatorImpl();
//实例化租房者角色
BuyerAndSeller tenant=new Tenant(mediator);
//实例化房东角色
BuyerAndSeller landlord=new Landlord(mediator);
//租房者的动作
tenant.selfAction();
tenant.getAction();
结果:
//房东的动作
landlord.selfAction();
landlord.getAction();
结果: