七、中介者模式
1. 定义
- 又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以 独立地改变它们之间的交互。
2. 结构
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的 抽象方法。
- 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对 象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽 象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交 互时,由中介者对象负责后续的交互。
3. 案例
-
举一个男女朋友的故事吧,需要一个中介者进行传话
-
UML
![image-20210528151321371](https://gitee.com/jerrygrj/img/raw/master/img/image-20210528151321371.png)
4. 代码
- mediator
/** * 抽象中介者类 */public abstract class Mediator { public abstract void constact(String message,Person person);}
- MediatorStructure
/**
* 具体的中介者角色类
*/
public class MediatorStructure extends Mediator{
//聚合男孩和女孩对象
private Girl girl;
private Boy boy;
public Girl getGirl() {
return girl;
}
public void setGirl(Girl girl) {
this.girl = girl;
}
public Boy getBoy() {
return boy;
}
public void setBoy(Boy boy) {
this.boy = boy;
}
@Override
public void constact(String message, Person person) {
if(person == boy){
girl.getMessage(message);
}else {
boy.getMessage(message);
}
}
}
- Person
/**
* 抽象同事类
*/
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
- Girl
/** * 具体的同事角色类 */public class Girl extends Person{ public Girl(String name, Mediator mediator) { super(name, mediator); } /** * 和中介联系 * @param message */ public void constact(String message){ mediator.constact(message,this); } //获取信息 public void getMessage(String message){ System.out.println("女孩收到:"+message); }}
- Boy
/** * 具体的同事角色类 */public class Boy extends Person{ public Boy(String name, Mediator mediator) { super(name, mediator); } /** * 和中介联系 * @param message */ public void constact(String message){ mediator.constact(message,this); } //获取信息 public void getMessage(String message){ System.out.println("男孩收到:"+message); }}
- 测试类
public class Client { public static void main(String[] args) { //创建中介者对象 MediatorStructure ms = new MediatorStructure(); //创建女孩对象 Girl girl = new Girl("Crj",ms); //创建男孩对象 Boy boy = new Boy("Jerry",ms); //中介者要知道具体的男孩,女孩 ms.setBoy(boy); ms.setGirl(girl); //设置双方需要传递的话语 boy.constact("我要找Crj"); girl.constact("别来了"); }}//测试结果//女孩收到:我要找Crj//男孩收到:别来了
5. 优缺点
优点
- 松散耦合
- 多个同事对象互补,封装到中介者对象,当交互行为发生变化时,只需要改中介者对象。
- 一对多关联变为一对一关联,由中介者一对一进行对话
缺点
- 当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
6. 使用场景
- 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
- 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。