设计模式-行为型模式-中介者模式
1.中介者模式定义
定义一个单独的(中介)对象,来封装一组对象之间的交互,将这组对象之间的交互委派给中介对象交互,从而避免对象之间的交互;
中介者模式主要解决对象间的交互复杂性问题,而代理模式则主要用于控制对某个对象的访问;
1.1 中介者模式的优缺点
优点
- 简化了对象之间的交互,易于维护和扩展,将原本难以理解的网状结构换成了相对简单的星型结构;
- 可以将各个同事对象进行解耦,可以独立的改变或者复用每一个同事或中介者,增加新的中介者类,增加新的中介者类和新的同事类比较方便,符合开闭原则;
- 可以减少子类生成,中介者将原本分布在多个对象的行为集中在了一起,改变这些行为只需要生成新的中介者的子类即可,使得同事类可以被复用,无需直接对同事类进行扩展;
缺点
- 在具体中介者类中包含了大量同事类之间的交互细节,可能会导致中介者类非常复杂,使得系统不好维护;
1.2 中介者模式的使用场景
- 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解的情况;
- 一个对象由于引用了其他的很多对象且直接和这些对象进行通信,导致对象难以复用的情况;
- 想要通过一个中间类来封装多个类中的行为,而又不想生成太多子类的情况;
2.中介者模式的原理
- 抽象中介者类(Mediator):提供了同事对象注册与转发同事对象信息的抽象方法;
- 具体中介者类(Concrete Mediator):实现抽象中介者,定义一个list来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事类;
- 抽象同事类(Colleague):保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能;
- 具体同事类(Concrete Colleague):实现抽象同事类,当需要与其他同事对象交互时,由中介者对象负责后续的交互;
3.中介者模式的实现
【实例】
以租房为例,房东、中介与租房者之间的关系;
【代码】
抽象中介者
public abstract class Mediator {
//申明一个联络方法
public abstract void contact(String message,Person person);
}
抽象同事类
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
房产中介
public class MediatorStructure extends Mediator {
//中介要知晓房主和租房者的信息
private HouseOwner houseOwner;
private Tenant tenant;
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
@Override
public void contact(String message, Person person) {
if(person == houseOwner){ //如果是房主,则租房者获得信息
tenant.getMessage(message);
}else { //如果是租房者则获取房主信息
houseOwner.getMessage(message);
}
}
}
具体同事类-房东
public class HouseOwner extends Person{
public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
//与中介者联系
public void contact(String message){
mediator.contact(message,this);
}
//获取信息
public void getMessage(String message){
System.out.println("房主" + name + "获取到的信息: " + message);
}
}
具体同事类-租房者
public class Tenant extends Person{
public Tenant(String name, Mediator mediator) {
super(name, mediator);
}
//与中介者联系
public void contact(String message){
mediator.contact(message,this);
}
//获取信息
public void getMessage(String message){
System.out.println("租房者" + name + "获取到的信息: " + message);
}
}
客户端
public class Client {
public static void main(String[] args) {
//一个房主 一个租房者 一个中介机构
MediatorStructure mediator = new MediatorStructure();
//房主和租房者只需要知道中介机构即可
HouseOwner houseOwner = new HouseOwner("路飞", mediator);
Tenant tenant = new Tenant("娜美", mediator);
//中介收集房租和租房者信息
mediator.setHouseOwner(houseOwner);
mediator.setTenant(tenant);
tenant.contact("需要一个两室一厅的房子,一家人住");
houseOwner.contact("出租一套两室一厅带电梯,月租3000");
}
}