设计模式(行为型设计模式------中介者模式)
中介者模式
基本定义
所谓中介者模式就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式又叫调停者模式,它是迪米特法则的典型应用。
模式结构
- Mediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。
- ConcreteMediator: 具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
- Colleague: 抽象同事类。
- ConcreteColleague: 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
代码实现
Mediator: 抽象中介者。
java
public abstract class Mediator {
//收集信息,转发信息
public abstract void contact(String message, Person person);
}
ConcreteMediator: 具体中介者,核心类。
java
/*
* @Description 具体中介者类(核心类):转发信息,负责转发给对应同事类
* 代理模式与中介模式的区别:
* 1、中介者模式支持买家和卖家信息沟通(获取房源,商谈价格),中介模式作用是解耦对象之间的关系
* 2、代理模块可以办理买房手续,单方交互, 代理模式作用是增强对象的能力
*/
@Getter
@Setter
@Slf4j
public class ConcreteMediator extends Mediator {
private Seller seller;
private Buyer buyer;
//转发消息
@Override
public void contact(String message, Person person) {
//如果是卖家,信息交给买家处理
if(person instanceof Seller){
buyer.getMessage(message);
}else if(person instanceof Buyer){
seller.getMessage(message);
}else {
log.error("未知类型:{}", person.getClass().getName());
}
}
}
Colleague: 抽象同事类。
java
@Setter
@Getter
public abstract class Person {
String name;
Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
ConcreteColleague: 具体同事类。
java
/**
* @Description ConcreteColleague 具体同事类
* 买家 中介者需要联系的一方存在
**/
@Slf4j
public class Buyer extends Person {
public Buyer(String name, Mediator mediator) {
super(name, mediator);
}
//联系中介者
public void contact(String message){
mediator.contact(message, this);
}
//处理消息
public void getMessage(String message){
log.info("买家:{}, 收到信息:{}", super.name, message);
}
}
java
/**
* @Description ConcreteColleague 具体同事类
* 卖家 中介者需要联系的一方存在
**/
@Slf4j
public class Seller extends Person {
public Seller(String name, Mediator mediator) {
super(name, mediator);
}
//联系中介者
public void contact(String message){
mediator.contact(message, this);
}
//处理消息
public void getMessage(String message){
log.info("卖家:{}, 收到信息:{}", super.name, message);
}
}
测试类
java
public class Test {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
Seller seller = new Seller("宋江", mediator);
Buyer buyer = new Buyer("矮脚虎", mediator);
mediator.setSeller(seller);
mediator.setBuyer(buyer);
seller.contact("我有三十套房, 打算卖10套");
buyer.contact("我要买套房, 打算买1套");
}
}
输出结果
买家:矮脚虎, 收到信息:我有三十套房, 打算卖10套 卖家:宋江, 收到信息:我要买套房, 打算买1套
优点
- 简化了对象之间的关系,将各个同事类解耦,使系统成为松耦合系统。
- 对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
缺点
当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
应用场景
- 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
总结
在中介者模式中通过引用中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少。它简化了系统的结构,将系统由负责的网状结构转变成简单的星形结构,中介者对象在这里起到中转和协调作用。
中介者类是中介者模式的核心,它对整个系统进行控制和协调,简化了对象之间的交互,还可以对对象间的交互进行进一步的控制。
具体的同事类可以独立变化,通过引用中介者可以简化同事类的设计和实现。
就是由于中介者对象需要知道所有的具体同事类,封装具体同事类之间相互关系,导致中介者对象变得非常复杂,当同事类过多时,系统维护起来较为困难。