中介者模式
介绍
中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,降低多个对象和类之间的通信复杂性
该模式限制对象之间的直接依赖和交互,而是让他们与一个中介者对象进行合作。
它将一个对象从决策者转变为参与者,将决策权交予中介者统一管理
它会将一个网状依赖结构变为星型结构
飞机降落时,各个飞机之间不直接相互沟通确定降落顺序,而是通过塔台安排降落顺序
使用场景:
- 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
中介者模式简化了对象交互(依赖),将参与者解耦,符合迪米特法则。
对于复杂的对象之间的交互,可以引入中介者,简化各个类的依赖关系
但中介者承担了较多责任,容易变得较为复杂,且不稳定。如新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,可以搭配其他设计模式(观察者模式和状态模式)来解决这个问题。
原理和角色
下图中,中介者负责协调Component对象之间的关系,Component也通常被称为Colleague(同事类)
代码示例:(来自五分钟设计模式 - 22中介者模式)
public class MediatorPattern {
public static void main(String[] args) {
// 1. 定义中介者
MarriageMediator mediator = new MarriageMediatorImpl();
Person p1 = new Person("小明", 18, true, 18, mediator);
Person p2 = new Person("小红", 25, false, 18, mediator);
Person p3 = new Person("小兰", 18, false, 18, mediator);
// 2. 将需要交互的对象添加到中介者中
mediator.register(p1);
mediator.register(p2);
mediator.register(p3);
// 3. 由中介者负责与多个对象沟通
mediator.pair(p1);
}
}
/** 婚介所 */
interface MarriageMediator {
/** 注册会员 */
void register(Person person);
/** 相亲。在这里,由中介者负责与多个对象进行交互 */
void pair(Person person);
}
class Person {
String name;
int age;
boolean sex;
int requestAge;
// 中介
MarriageMediator mediator;
// 要求传入中介类对象
public Person(String name, int age, boolean sex,
int requestAge, MarriageMediator mediator) {...}
// 相亲
public void findPartner() {
// 让婚介所为自己寻找伴侣(让中介类负责与其他对象进行交互)
mediator.pair(this);
}
}
class MarriageMediatorImpl implements MarriageMediator {
/** 保存需要交互的对象 */
List<Person> members = new ArrayList<>();
@Override
public void register(Person person) {
members.add(person);
}
@Override
public void pair(Person requestPerson) {
/*
由中介者负责与多个对象进行交互
*/
for (Person member : members) {
// 判断相亲是否成功
if (member.age == requestPerson.requestAge && member.sex != requestPerson.sex) {
System.out.println("将 " + requestPerson.name + " 与 " + member.name + " 送入洞房!");
}
}
}
}