用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互
介绍
对于中介,大家多半想到出租房子吧!好吧!今天就以出租房子作为例子!
中介租房东的房子,然后中介将房子出租给租客。
上面的房屋出租过程,租客和房东完全不需要相互交流就可以将业务完成,也就是租客和房东之间解耦合了。
下面我们看看UML图吧!
UML图
代码
- 先模拟中介吧
public abstract class Mediator {
public abstract void send(String message, Person colleague);
}
class ConcreteMediator extends Mediator{
private Tenant tenant;
private Landlord landlord;
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
public void setLandlord(Landlord landlord) {
this.landlord = landlord;
}
@Override
public void send(String message, Person colleague) {
if(colleague == tenant){
landlord.notify(message);
} else {
tenant.notify(message);
}
}
}
- 房东和租客
public abstract class Person {
protected Mediator mediator;
public Person(Mediator mediator){
this.mediator = mediator;
}
}
class Tenant extends Person {
public Tenant(Mediator mediator) {
super(mediator);
}
public void notify(String message){
System.out.println("中介给房客信息:" + message);
}
public void send(String message){
mediator.send(message,this);
}
}
class Landlord extends Person {
public Landlord(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.send(message,this);
}
public void notify(String message){
System.out.println("中介给房东信息:" + message);
}
}
- 调用方法
public class Demo {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
Tenant tenant = new Tenant(mediator);
Landlord landlord = new Landlord(mediator);
mediator.setTenant(tenant);
mediator.setLandlord(landlord);
landlord.send("我有一套房子,我希望出租出去,有没有租啊?");
tenant.send("我希望租这套房子");
}
}
- 打印结果
中介给房客信息:我有一套房子,我希望出租出去,有没有租啊?
中介给房东信息:我希望租这套房子
总结
- 中介模式可以很有效的将房客和租客进行解耦,使得各个对象可以被复用。
- 中介模式的缺点也很明显,如果此时多了一个物业参与,那么3者之间都要与中介类产生联系,势必要修改中介者类。同时中介者类也将变得更为复杂。并且复杂成倍数增长。所以当对象很多时,谨慎使用中介者模式。
- 中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。