定义一个中介者来封装对象之间的交互,使原有对象之间松解耦合,可以独立改变对象之间的交互。
是迪米特法则的典型应用。
通过中介者,解耦系统中各层次对象的直接耦合,各层次对象对外依赖的通信 交由中介者转发。
应用场景
- 系统中对象之间的引用关系复杂,依赖关系结构混乱,可以添加中介者
- 交互的公共行为需要改变,可以添加中介者
聊天室、注册中心
优点:
1)对象之间松耦合
2)对象之间一对多的关联变成一对一的关联,提升扩展性。
缺点:
如果中介者过多,会提升系统复杂性。
案例
3个设备,任意一个打开,其他两个也要打开,耦合度很高。
如果有一个设备要更换,会很麻烦。
解决方案
引入中介者模式
类结构图
代码示例
定义一个接口 Media,有 开、关 两个方法。
public interface Media {
void open(Mediator mediator);
void wakeup();
}
实现类1
public class FirstMediaImpl implements Media {
@Override
public void open(Mediator mediator) {
System.out.println("设备一打开");
mediator.openFirst();
}
@Override
public void wakeup() {
System.out.println("设备一被唤醒");
}
}
实现类2
public class SecondMediaImpl implements Media {
@Override
public void open(Mediator mediator) {
System.out.println("设备二打开");
mediator.openFirst();
}
@Override
public void wakeup() {
System.out.println("设备二被唤醒");
}
}
实现类3
public class ThirdMediaImpl implements Media {
@Override
public void open(Mediator mediator) {
System.out.println("设备三打开");
mediator.openFirst();
}
@Override
public void wakeup() {
System.out.println("设备三被唤醒");
}
}
中介者类,持有3个实现类的应用,对外提供方法,对3个实现类进行控制。
public class Mediator {
private Media first;
private Media second;
private Media third;
public Mediator(Media first, Media second, Media third) {
this.first = first;
this.second = second;
this.third = third;
}
public void openFirst(){
second.wakeup();
third.wakeup();
}
public void openSecond(){
first.wakeup();
third.wakeup();
}
public void openThird(){
first.wakeup();
second.wakeup();
}
}
测试类
public class Client {
public static void main(String[] args) {
Media first = new FirstMediaImpl();
Media second = new SecondMediaImpl();
Media third = new ThirdMediaImpl();
Mediator mediator = new Mediator(first, second, third);
first.open(mediator);
}
}
中介者模式 PK 桥接模式
桥接模式是两者之间的关联,相对单一。