1.概述
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性,这种模式提供了一个中介类,来封装一组对象之间的交互,它将对象之间的交互委派给中介对象交互,避免了对象之间的直接交互。中介者又叫调停模式,是迪米特法则的典型代表。本文将详述中介者模式的原理及使用,帮助大家更好地理解。
2.原理及使用
2.1 原理
中介者的UML类图如下所示:
中介者包含的核心角色有四个:Mediator(抽象中介者)、ConcreteMediator(具体中介者)、Colleague(抽象同事角色)、ConcreteColleague(具有同事角色),具体角色职能如下:
Mediator(抽象中介者):用来定义参与者与中介者之间的交互方式;
ConcreteMediator(具体中介者):实现抽象中介者接口,实现具体交互方式;
Colleague(抽象同事角色):抽象类或者接口,定义参与者如何进行交互;
ConcreteColleague(具有同事角色):实现Colleague中的方法,定义具体行为。
2.2 案例
举一个中介买房的例子把,比较贴切。中介小王专门负责帮助顾客买卖房子,如果没有中介小王,准备卖房的小张和小李就要自己去发广告、联系买房的人,同样,卖房的王大妈也要自己去打广告,联系买房。小王在这里就相当于中介者,来接受卖方和买方的信息,推荐促成买卖。案例类图如下:
代码如下:
public interface Colleague {
void sale();
void buy();
}
public class HouseBuyer implements Colleague {
private String name;
private Double price;
private Double size;
public HouseBuyer(String name, Double price, Double size) {
this.name = name;
this.price = price;
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Double getSize() {
return size;
}
public void setSize(Double size) {
this.size = size;
}
@Override
public void sale() {
}
@Override
public void buy() {
System.out.println(name + "需要的房子大小为:" + size + ",价格为:" + price);
System.out.println(name + "寻找中介。。。");
}
}
public class HouseSale implements Colleague {
private String name;
private Double price;
private Double size;
public HouseSale(String name, Double price, Double size) {
this.name = name;
this.price = price;
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Double getSize() {
return size;
}
public void setSize(Double size) {
this.size = size;
}
@Override
public void sale() {
System.out.println(name + "卖的房子大小为:" + size + ",价格为:" + price);
}
@Override
public void buy() {
}
}
public interface Mediator {
void deal();
}
public class WangMediator implements Mediator {
private String name;
private Colleague saler;
private Colleague buyer;
public WangMediator(String name, Colleague saler, Colleague buyer) {
this.name = name;
this.saler = saler;
this.buyer = buyer;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Colleague getSaler() {
return saler;
}
public void setSaler(Colleague saler) {
this.saler = saler;
}
public Colleague getBuyer() {
return buyer;
}
public void setBuyer(Colleague buyer) {
this.buyer = buyer;
}
@Override
public void deal() {
saler.sale();
System.out.println(name + "去寻找买方");
buyer.buy();
System.out.println(name + "找到买方并成交");
}
}
测试代码:
public class Client {
public static void main(String[] args) {
//买方小王要买房
HouseBuyer houseBuyer = new HouseBuyer("小张", 150.0, 90.0);
//卖方王大妈要卖房
HouseSale houseSale = new HouseSale("王大妈", 160.0, 90.0);
//他们都找中介者小王
WangMediator wangMediator = new WangMediator("小王", houseSale, houseBuyer);
//小王根据需求匹配
wangMediator.deal();
}
}
运行结果如下:
上述案例中,卖方和买方可能有多个,应该是个列表形式,中介者会根据需求去匹配合适的卖方与买方。
2.3 中介者的优点和缺点
2.3.1 优点
1.中介者降低了类之间的耦合程度,所有关联者只与中介者有关系,符合迪米特法则;
2.中介者将对象之间的网状关系变为星型关系,降低了耦合度。
2.3.2 缺点
1.中介者承担了较多的职责,如果中介者出现问题,可能会导致整个系统奔溃;
2.如果设计不当,会导致中介者本身过于复杂;
3.小结
1.中介者模式是一种降低类之间耦合的方式,在日常开发的使用相对较少;
2.中介者的设计思想本质就是降低耦合。
4.参考文献
1.《设计模式之禅》-秦小波著
2.《大话设计模式》-程杰著
3.https://www.bilibili.com/video/BV1G4411c7N4-尚硅谷设计模式
4.https://juejin.cn/post/6986798871858905118