(1)一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有 6 个同事类对象,假如对象 1 发生变化,那么将会有 4 个对象受到影响。如果对象 2 发生变化,那么将会有 5 个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。
(2)如果引入中介者模式,那么同事类之间的关系将变为星型结构,从下右图中可以看到,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为。
(3)中介者模式 (Mediator Pattern) 是一种行为型设计模式,它允许对象通过一个中介对象来进行协作,而不是直接相互引用,从而降低对象之间的耦合度,同时提高代码的可维护性和可扩展性。
中介者模式包含以下主要角色:
【例】租房:现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。其类图下:
具体实现代码如下:
Mediator.java
//抽象中介者类
public abstract class Mediator {
public abstract void constact(String message, Person person);
}
Person.java
//抽象同事类
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
//租房者
public class Tenant extends Person{
public Tenant(String name, Mediator mediator) {
super(name, mediator);
}
//和中介沟通的方法
public void constact(String message){
mediator.constact(message, this);
}
//获取信息
public void getMessage(String message){
System.out.println("租房者" + name + "获取到的信息是:" + message);
}
}
HouseOwner.java
//房主类
public class HouseOwner extends Person{
public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
//和中介沟通的方法
public void constact(String message){
mediator.constact(message,this);
}
//获取信息
public void getMessage(String message){
System.out.println("房主" + name + "获取到的信息是:" + message);
}
}
MediatorStructure.java
//具体的中介者角色类
public class MediatorStructure extends Mediator {
//聚合房主和具体的租房者对象
private HouseOwner houseOwner;
private Tenant tenant;
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
@Override
public void constact(String message, Person person) {
if (person == houseOwner) {
tenant.getMessage(message);
} else {
houseOwner.getMessage(message);
}
}
}
Client.java
public class Client {
public static void main(String[] args) {
//创建中介者对象
MediatorStructure mediator = new MediatorStructure();
//创建租房者对象
Tenant tenant = new Tenant("李四", mediator);
//创建房主对象
HouseOwner houseOwner = new HouseOwner("张三", mediator);
//中介者要知道具体的房主和租房者
mediator.setTenant(tenant);
mediator.setHouseOwner(houseOwner);
tenant.constact("我要租三室的房子!");
houseOwner.constact("我这里有三室的房子,你要租吗?");
}
}
输出结果如下:
房主张三获取到的信息是:我要租三室的房子!
租房者李四获取到的信息是:我这里有三室的房子,你要租吗?
(1)中介者模式的优点包括:
(2)中介者模式的缺点包括:
(3)所以在使用中介者模式时,需要权衡其优势和缺点,并根据具体情况进行选择。它适用于对象之间的交互关系复杂、需要集中管理和协调的场景,但对于简单的交互行为,可能会过于繁琐和不必要。
(1)中介者模式适用于以下场景:
(2)一些常见的应用中介者模式的场景包括:
(3)总之,中介者模式适用于需要集中管理和协调对象之间交互关系的复杂场景,以提高系统的灵活性、可维护性和可扩展性。