返回
中介者模式:松散耦合与行为控制的利器
见解分享
2024-01-21 07:40:57
## 中介者模式概述
中介者模式是一种设计模式,它可以将多个对象之间的交互集中到一个中介对象中,从而减少对象之间的直接依赖关系。这样一来,当对象之间发生交互时,它们不必直接与彼此通信,而是通过中介对象来进行交互。这使得代码更容易维护和扩展,因为当对象之间的交互发生改变时,只需要修改中介对象,而不需要修改所有相关的对象。
## 中介者模式结构
中介者模式的基本结构包括以下几个元素:
* **中介者对象:** 中介者对象是中介者模式的核心,它负责协调和管理多个对象之间的交互。
* **具体对象:** 具体对象是参与交互的对象,它们通过中介者对象进行通信。
* **同事接口:** 同事接口定义了具体对象与中介者对象之间的通信方式。
## 中介者模式的优缺点
中介者模式的主要优点包括:
* **松散耦合:** 中介者模式可以将多个对象之间的耦合度降到最低,从而提高代码的可维护性和可扩展性。
* **行为控制:** 中介者对象可以集中控制多个对象的行为,从而使代码更加易于理解和维护。
* **可重用性:** 中介者对象可以被复用在多个不同的场景中,从而提高代码的可复用性。
中介者模式的主要缺点包括:
* **性能开销:** 中介者模式可能会引入额外的性能开销,因为所有的交互都必须通过中介对象进行。
* **复杂性:** 中介者模式可能会使代码变得更加复杂,尤其是当对象之间的交互比较复杂时。
## 中介者模式的使用场景
中介者模式常用于以下场景:
* **多个对象之间需要频繁交互:** 当多个对象之间需要频繁交互时,中介者模式可以将这些交互集中到一个中介对象中,从而减少对象之间的直接依赖关系,提高代码的可维护性和可扩展性。
* **多个对象的行为需要协调:** 当多个对象的行为需要协调时,中介者模式可以将这些对象的协调工作集中到一个中介对象中,从而使代码更加易于理解和维护。
* **多个对象需要共享数据:** 当多个对象需要共享数据时,中介者模式可以将这些数据的管理工作集中到一个中介对象中,从而提高代码的可维护性和可扩展性。
## 中介者模式示例
为了更好地理解中介者模式,我们来看一个实际的例子。假设我们有一个系统,在这个系统中,有多个用户和多个产品。用户可以对产品进行评论,产品也可以对用户进行评价。如果我们使用传统的对象设计方式,那么用户对象和产品对象之间就会存在直接的依赖关系。这会导致代码难以维护和扩展,因为当用户和产品之间的交互发生改变时,我们需要修改所有的用户对象和产品对象。
为了解决这个问题,我们可以使用中介者模式。我们可以创建一个中介对象,它负责管理和控制用户和产品之间的交互。这样一来,当用户和产品之间的交互发生改变时,我们只需要修改中介对象,而不需要修改所有的用户对象和产品对象。
以下是中介者模式示例的代码:
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
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`对象会将消息发送给所有的具体对象,除了发送消息的对象本身。
通过使用中介者模式,我们将用户对象和产品对象之间的交互集中到了一个中介对象中,从而减少了对象之间的直接依赖关系,提高了代码的可维护性和可扩展性。