中介者模式属于行为型模式,描述了对象之间的一种行为模式。当多个对象之间需要进行通信,而通信过程又比较复杂,此时可以使用中介者模式。用一个中介对象来封装对象之间的一系列的交互,使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们。
比如现实世界中的租房。如果让房东和房客之间直接进行交互,房东需要四处发放租房信息,而房客也需要四处寻找租房信息,而且需要签订租房合同等等法律条款,过程会比较复杂。但是房屋中介的出现,让二者之间的过程大大简化。房东只需要将租房信息交给中介,而房客也只需要找中介查询租房信息。此时的房屋中介就起到了中介对象的作用。
中介者类图如下:
对应的代码如下:
Mediator.java
package mediator;
public abstract class Mediator {
protected Person mRentor;
protected Person mLandLord;
public abstract void setRentor(Person person);
public abstract void setLandLord(Person person);
public abstract void send(final String message, Person person);
}
HouseMediator.java
package mediator;
public class HouseMediator extends Mediator {
@Override
public void setRentor(Person person) {
// TODO Auto-generated method stub
mRentor = person;
}
@Override
public void setLandLord(Person person) {
// TODO Auto-generated method stub
mLandLord = person;
}
@Override
public void send(String message, Person person) {
// TODO Auto-generated method stub
if(person == mRentor){
mLandLord.getMessage(message);
}else if(person == mLandLord){
mRentor.getMessage(message);
}else{
System.out.println("Unknown person");
}
}
}
Person.java
package mediator;
public abstract class Person {
protected Mediator mMediator;
public void setMediator(Mediator mediator){
mMediator = mediator;
}
public abstract void sendMessage(final String message);
public abstract void getMessage(final String message);
}
Renter.java
package mediator;
public class Rentor extends Person {
@Override
public void sendMessage(String message) {
// TODO Auto-generated method stub
mMediator.send(message, this);
}
@Override
public void getMessage(String message) {
// TODO Auto-generated method stub
System.out.println("Rentor get message: " + message);
}
}
LandLord.java
package mediator;
public class LandLord extends Person {
@Override
public void sendMessage(String message) {
// TODO Auto-generated method stub
mMediator.send(message, this);
}
@Override
public void getMessage(String message) {
// TODO Auto-generated method stub
System.out.println("LandLord get message: " + message);
}
}
Main.java
package mediator;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Mediator mediator = new HouseMediator();
Person rentor = new Rentor();
Person landlord = new LandLord();
mediator.setRentor(rentor);
mediator.setLandLord(landlord);
rentor.setMediator(mediator);
landlord.setMediator(mediator);
rentor.sendMessage("I would like to rent a house");
landlord.sendMessage("I would like to land a house");
}
}