目的
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
使用场景
- 一组对象以定的工艺良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解
- 一个对象那个引用其他很多对象并且直接与这些对象通信,倒置难以服用该对象
- 想定制一个分布在多个类中的行为,但是又不想生成太多的子类
具体例子
在我们的生活中,我们和中介有很多接触。中介就是和很多人之间进行通信,这样的话很多个不认识的人能够通过中介就能进行交流,图片示意如下:
在这个情况下只有四个主要的类,他们分别是Mediator抽象中介者,ConcreteMediator中介者实体类和Colleague抽象同事类和ConcreteColleague实体同事类。同事类并不需要认识对方,只需要认识中介类就好了。中介类负责和每一个同事类之间通信。
代码例子如下:
package mediator;
/**
* 租客和房东的抽象类
*/
public abstract class Person {
protected String name;
protected Mediator mediator;
Person(String name, Mediator mediator){
this.name = name;
this.mediator = mediator;
}
}
package mediator;
/**
* 房东类
*/
public class HouseOwner extends Person {
HouseOwner(String name,Mediator mediator){
super(name,mediator);
}
public void constact(String message){
mediator.constract(message,this);
}
public void getMessage(String message){
System.out.println("房主"+name+",获得信息"+message);
}
}
package mediator;
/**
* 租客类
*/
public class Tenant extends Person {
Tenant(String name,Mediator mediator){
super(name,mediator);
}
public void contact(String message){
mediator.constract(message,this);
}
public void getMessage(String message){
System.out.println("租房者"+name+";获得信息:"+message);
}
}
package mediator;
/**
* 中介接口
*/
public interface Mediator {
void constract(String message,Person person);
}
package mediator;
/**
* 具体中介类
*/
public class ContractMediator implements Mediator {
private HouseOwner houseOwner;
private Tenant tenant;
public HouseOwner getHouseOwner(){
return houseOwner;
}
public Tenant getTenant(){
return tenant;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
public void constract(String message,Person person){
if(person == houseOwner){
tenant.getMessage(message);
}else{
houseOwner.getMessage(message);
}
}
}
package mediator;
import iterator.ConcreteList;
public class Client {
public static void main(String[] args) {
ContractMediator mediator = new ContractMediator();
HouseOwner houseOwner = new HouseOwner("房东",mediator);
Tenant tenant = new Tenant("租客",mediator);
mediator.setHouseOwner(houseOwner);
mediator.setTenant(tenant);
houseOwner.getMessage("我有房要租");
tenant.getMessage("我要租房");
}
}