返回

中介者模式:松散耦合与行为控制的利器

见解分享







## 中介者模式概述

中介者模式是一种设计模式,它可以将多个对象之间的交互集中到一个中介对象中,从而减少对象之间的直接依赖关系。这样一来,当对象之间发生交互时,它们不必直接与彼此通信,而是通过中介对象来进行交互。这使得代码更容易维护和扩展,因为当对象之间的交互发生改变时,只需要修改中介对象,而不需要修改所有相关的对象。

## 中介者模式结构

中介者模式的基本结构包括以下几个元素:

* **中介者对象:** 中介者对象是中介者模式的核心,它负责协调和管理多个对象之间的交互。
* **具体对象:** 具体对象是参与交互的对象,它们通过中介者对象进行通信。
* **同事接口:** 同事接口定义了具体对象与中介者对象之间的通信方式。

## 中介者模式的优缺点

中介者模式的主要优点包括:

* **松散耦合:** 中介者模式可以将多个对象之间的耦合度降到最低,从而提高代码的可维护性和可扩展性。
* **行为控制:** 中介者对象可以集中控制多个对象的行为,从而使代码更加易于理解和维护。
* **可重用性:** 中介者对象可以被复用在多个不同的场景中,从而提高代码的可复用性。

中介者模式的主要缺点包括:

* **性能开销:** 中介者模式可能会引入额外的性能开销,因为所有的交互都必须通过中介对象进行。
* **复杂性:** 中介者模式可能会使代码变得更加复杂,尤其是当对象之间的交互比较复杂时。

## 中介者模式的使用场景

中介者模式常用于以下场景:

* **多个对象之间需要频繁交互:** 当多个对象之间需要频繁交互时,中介者模式可以将这些交互集中到一个中介对象中,从而减少对象之间的直接依赖关系,提高代码的可维护性和可扩展性。
* **多个对象的行为需要协调:** 当多个对象的行为需要协调时,中介者模式可以将这些对象的协调工作集中到一个中介对象中,从而使代码更加易于理解和维护。
* **多个对象需要共享数据:** 当多个对象需要共享数据时,中介者模式可以将这些数据的管理工作集中到一个中介对象中,从而提高代码的可维护性和可扩展性。

## 中介者模式示例

为了更好地理解中介者模式,我们来看一个实际的例子。假设我们有一个系统,在这个系统中,有多个用户和多个产品。用户可以对产品进行评论,产品也可以对用户进行评价。如果我们使用传统的对象设计方式,那么用户对象和产品对象之间就会存在直接的依赖关系。这会导致代码难以维护和扩展,因为当用户和产品之间的交互发生改变时,我们需要修改所有的用户对象和产品对象。

为了解决这个问题,我们可以使用中介者模式。我们可以创建一个中介对象,它负责管理和控制用户和产品之间的交互。这样一来,当用户和产品之间的交互发生改变时,我们只需要修改中介对象,而不需要修改所有的用户对象和产品对象。

以下是中介者模式示例的代码:

public interface Mediator {
public void send(String message, Colleague colleague);
}

public abstract class Colleague {
protected Mediator mediator;

public Colleague(Mediator mediator) {
    this.mediator = mediator;
}

public void send(String message) {
    mediator.send(message, this);
}

public abstract void receive(String message);

}

public class ConcreteMediator implements Mediator {
private List colleagues = new ArrayList<>();

public void addColleague(Colleague colleague) {
    colleagues.add(colleague);
}

@Override
public void send(String message, Colleague colleague) {
    for (Colleague c : colleagues) {
        if (c != colleague) {
            c.receive(message);
        }
    }
}

}

public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}

@Override
public void receive(String message) {
    System.out.println("ConcreteColleagueA received message: " + message);
}

}

public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}

@Override
public void receive(String message) {
    System.out.println("ConcreteColleagueB received message: " + message);
}

}

public class Client {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();

    Colleague colleagueA = new ConcreteColleagueA(mediator);
    Colleague colleagueB = new ConcreteColleagueB(mediator);

    mediator.addColleague(colleagueA);
    mediator.addColleague(colleagueB);

    colleagueA.send("Hello, colleagueB!");
    colleagueB.send("Hello, colleagueA!");
}

}


在这个示例中,`Mediator`接口定义了中介对象的行为,`Colleague`类是具体对象的抽象类,`ConcreteMediator`类是具体的中介对象类,`ConcreteColleagueA`和`ConcreteColleagueB`类是具体的对象类。`Client`类是客户端类,它负责创建对象和启动交互。

当`ConcreteColleagueA`对象调用`send()`方法时,它会将消息发送给中介对象`ConcreteMediator`。然后,`ConcreteMediator`对象会将消息发送给所有的具体对象,除了发送消息的对象本身。当`ConcreteColleagueB`对象调用`send()`方法时,它也会将消息发送给中介对象`ConcreteMediator`。然后,`ConcreteMediator`对象会将消息发送给所有的具体对象,除了发送消息的对象本身。

通过使用中介者模式,我们将用户对象和产品对象之间的交互集中到了一个中介对象中,从而减少了对象之间的直接依赖关系,提高了代码的可维护性和可扩展性。