介绍
- 中介者模式(Mediator Pattern)用一个中介对象来封装一系列对象交互,中介使各个对象不要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
- 中介者属于行为型模式,使代码易于维护。
- 比如 MVC 模式 C (Controller 控制器) 是 M (Model 模型) 和 V (view 视图) 的中介者
- Mediator : 是抽象中介者,定义了同事对象到中介者对象的接口
- Colleague : 是抽象同事类
- ConcreteMediator : 是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令
- ConcreteColleague : 是具体同事类,每个具体同事只知道自己的行为,而不了解其它同事类的情况,但它们却都认识中介者对象。
案例
- 现在我们生活中有许多中介:如链家、我爱我家等
- 现在张三要买房,而李四要买车,他们都委托中介购买
创建中介者抽象类
@Data
public abstract class Mediator {
private String name;
public Mediator(String name) {
this.name = name;
}
/**
* 注册
* @param colleague
*/
public abstract void register(Colleague colleague);
/**
* 转发
* @param colleague
* @param message
*/
public abstract void relay(Colleague colleague, String message);
}
创建中介者实现类 ConcreteMediator 继承 Mediator
public class ConcreteMediator extends Mediator{
/**
* 集合
*/
private List<Colleague> colleagues = new ArrayList<Colleague>();
public ConcreteMediator(String name) {
super(name);
}
@Override
public void register(Colleague colleague) {
if (!colleagues.contains(colleague)) {
colleagues.add(colleague);
colleague.setMedium(this);
}
}
@Override
public void relay(Colleague colleague, String message) {
for (Colleague ob : colleagues) {
if(ob != colleague)
ob.notify(message);
}
}
}
创建同事抽象类
@Data
public abstract class Colleague {
protected Mediator mediator;
public void setMedium(Mediator mediator) {
this.mediator = mediator;
}
/**
* 通知
* @param meaasge
*/
public abstract void notify(String meaasge);
/**
* 发送
* @param c1
* @param message
*/
public abstract void send(Colleague c1, String message);
}
创建同事1类 ConcreteColleague1 继承 Colleague
public class ConcreteColleague1 extends Colleague{
private String name;
public ConcreteColleague1(String name) {
this.name = name;
}
@Override
public void notify(String message) {
System.out.println("具体同"+name+"接收请求。" + message);
}
@Override
public void send(Colleague c1, String message) {
System.out.println("具体"+name+"发送请求:" + message);
mediator.relay(c1, message);
}
}
创建同事2类 ConcreteColleague2 继承 Colleague
public class ConcreteColleague2 extends Colleague{
private String name;
public ConcreteColleague2(String name) {
this.name = name;
}
@Override
public void notify(String message) {
System.out.println("具体同"+name+"接收请求。" + message);
}
@Override
public void send(Colleague c1, String message) {
System.out.println("具体"+name+"发送请求:" + message);
mediator.relay(c1, message);
}
}
客户端
public class Client {
public static void main(String[] args) {
Mediator md = new ConcreteMediator("中介者");
Colleague c1 = new ConcreteColleague1("张三");
md.register(c1);
Colleague c2 = new ConcreteColleague2("李四");
md.register(c2);
System.out.println("-------------");
c1.send(c1,"买车");
c2.send(c2,"买房");
}
}
优点和缺点
优点:
1)松散耦合、将多个对象之间的联系紧耦合封装到中介对象中,做到松耦合。
2)符合迪米特原则
3) 将多个对象之间的交互联系集中在中介对象中。发送变化仅需修改中介对象即可、提供系统的灵活性、使同事对象独立而易于复用。
缺点:
1)如果各个同事间的交互非常多并且复杂情况下,都交给中介者会导致中介者变得十分复杂,不易维护和管理。
适用场景:
1) 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2) 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
github Demo地址 : ~~~传送门~~~
个人博客地址:blog.yanxiaolong.cn/