定义
定义一个封装一组对象如何交互的对象;
通过使对象明确地相互引用来促进松散耦合,并允许独立的改变它们的交互;
行为型
适用场景
- 系统对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;
- 交互的公共行为,如果需要改变行为则可以增加新的中介类。
优点和缺点
优点
- 将一对多转化成了一对一,降低程序复杂度
- 类之间的解耦
缺点
结构
- 抽象中介者角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者角色:实现中介者接口,定义一个List来管理同事对象,协调各个同事之间的交互关系,因此它依赖于同事角色。
- 抽象同事类角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
代码实现
假设有一个中介小刘,做房产中介,有两个房东来找租客
抽象中介者角色,可以理解为中介这一个行业
1 2 3 4 5 6
| public abstract class Mediator {
public abstract void register(Colleague colleague); public abstract void relay(Colleague cl);
}
|
具体中介者角色
中介小刘,聚合了同事角色,也就是聚合了房东,保留房东的联系方式,两个方法,一个保存房东联系方式,一个给房东联系的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class XiaoLiuMediator extends Mediator{ private List<Colleague> colleagues = new ArrayList<>(); @Override public void register(Colleague colleague) { if (!colleagues.contains(colleague)) { colleagues.add(colleague); colleague.setMedium(this); } } @Override public void relay(Colleague cl) { for (Colleague ob : colleagues) { if (!ob.equals(cl)) { ob.receive(); } } } }
|
抽象同事类角色
聚合了一个中介,有三个方法,一个是保存中介信息,一个是联系中介租房的,一个是讨价还价的
1 2 3 4 5 6 7 8
| public abstract class Colleague { protected Mediator mediator; public void setMedium(Mediator mediator) { this.mediator = mediator; } public abstract void receive(); public abstract void send(); }
|
具体同事类角色1
1 2 3 4 5 6 7 8 9
| public class LandlordColleague1 extends Colleague { public void receive() { System.out.println("2000少一分都不行。"); } public void send() { System.out.println("我有房子要出租。"); mediator.relay(this); } }
|
具体同事类角色2
1 2 3 4 5 6 7 8 9
| public class LandlordColleague2 extends Colleague { public void receive() { System.out.println("1800一分都不能少。"); } public void send() { System.out.println("我也有房子要出租。"); mediator.relay(this); } }
|
客户端调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Test { public static void main(String[] args) { Mediator mediator = new XiaoLiuMediator();
Colleague l1 = new LandlordColleague1(); Colleague l2 = new LandlordColleague2();
mediator.register(l1); mediator.register(l2);
l1.send(); System.out.println("-------------------"); l2.send(); } }
|
结果:
1 2 3 4 5
| 我有房子要出租。 1800一分都不能少。 ------------------- 我也有房子要出租。 2000少一分都不行。
|
UML类图