设计模式:中介者模式

目录

  • 组件
  • 代码示例
  • 源码中的使用
  • 优缺点
  • 总结:

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过封装一组对象之间的交互,来减少对象之间的直接耦合。中介者模式通过引入一个中介者对象,将对象之间的通信转化为与中介者的交互,从而降低了对象之间的依赖关系。
在中介者模式中,对象之间的通信通过中介者进行,而不是直接相互调用。中介者对象负责协调和控制对象之间的交互,它封装了对象之间的通信逻辑,使得对象之间的关系更加松散。

组件

中介者模式通常包括以下组件:

  1. 抽象中介者(Abstract Mediator):定义了中介者对象的接口,用于协调和控制对象之间的交互。
  2. 具体中介者(Concrete Mediator):实现了抽象中介者接口,负责协调和控制对象之间的交互。它通常持有一组对象的引用,并根据对象之间的交互进行逻辑处理。
  3. 同事类(Colleague):每个同事类都知道中介者对象,并通过中介者对象来与其他同事类进行交互。同事类之间的通信通过中介者来进行,而不是直接相互调用。

中介者模式可以简化对象之间的通信,减少了对象之间的直接耦合。它将对象之间的交互逻辑集中在中介者对象中,使得系统更加灵活和可维护。中介者模式常用于复杂的对象交互场景,如图形界面、多人游戏等。

代码示例

import java.util.ArrayList;
import java.util.List;
 // 抽象中介者
interface Mediator {
    void sendMessage(String message, Colleague colleague);
}
 // 具体中介者
class ConcreteMediator implements Mediator {
    private List<Colleague> colleagues;
     public ConcreteMediator() {
        colleagues = new ArrayList<>();
    }
     public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }
     public void sendMessage(String message, Colleague colleague) {
        for (Colleague c : colleagues) {
            if (c != colleague) {
                c.receiveMessage(message);
            }
        }
    }
}
 // 同事类
abstract class Colleague {
    protected Mediator mediator;
     public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
     public abstract void send(String message);
     public abstract void receiveMessage(String message);
}
 // 具体同事类
class ConcreteColleague extends Colleague {
    public ConcreteColleague(Mediator mediator) {
        super(mediator);
    }
     public void send(String message) {
        System.out.println("发送消息:" + message);
        mediator.sendMessage(message, this);
    }
     public void receiveMessage(String message) {
        System.out.println("收到消息:" + message);
    }
}
 // 客户端代码
public class Main {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
         Colleague colleague1 = new ConcreteColleague(mediator);
        Colleague colleague2 = new ConcreteColleague(mediator);
         mediator.addColleague(colleague1);
        mediator.addColleague(colleague2);
         colleague1.send("Hello, colleague2!");
        colleague2.send("Hi, colleague1!");
    }
}

在上述示例中,我们定义了抽象中介者(Mediator)接口和具体中介者(ConcreteMediator)类。同事类(Colleague)是中介者模式中的参与者,其中具体同事类(ConcreteColleague)实现了抽象同事类的方法。客户端代码创建了中介者对象和同事对象,并将同事对象添加到中介者中。同事对象通过中介者对象进行消息的发送和接收。

这个示例展示了如何使用Java实现中介者模式,通过中介者对象来协调和控制对象之间的交互。中介者模式可以减少对象之间的直接耦合,使系统更加灵活和可扩展。

源码中的使用

在源码中,中介者模式有很多应用。以下是一些常见的源码中使用中介者模式的情况:

  1. Java AWT和Swing中的事件处理:在GUI应用程序中,中介者模式被广泛用于处理组件之间的事件和通信。通过使用中介者模式,各个组件之间的交互可以通过中介者进行协调和处理。
  2. Spring框架中的消息中间件:Spring的消息中间件模块(如Spring Integration)使用中介者模式来实现不同组件之间的消息传递和通信。通过中介者,各个组件可以解耦并通过消息进行通信。
  3. 航空管制系统:航空管制系统中的飞机、雷达、调度员等参与者之间的通信可以使用中介者模式。中介者作为调度员,负责协调和处理各个参与者之间的通信和决策。
  4. 聊天室应用程序:聊天室应用程序中的用户之间的通信可以通过中介者模式来实现。中介者作为聊天室的服务器,负责接收和转发用户之间的消息。
    中介者模式在源码中的应用非常广泛,它可以用于各种需要协调和控制多个对象之间交互的场景。通过中介者模式,可以减少对象之间的直接依赖,提高系统的灵活性和可维护性。

优缺点

优点:

  1. 解耦对象之间的关系:中介者模式将对象之间的交互行为集中在中介者对象中,使得对象之间的关系变得松散,减少了对象之间的直接依赖。
  2. 减少了类之间的耦合度:通过引入中介者对象,各个对象只需要与中介者进行通信,而不需要直接与其他对象进行通信,降低了类之间的耦合度。
  3. 简化了对象的交互:中介者模式将对象之间的交互行为封装在中介者中,使得对象只需要关注自身的逻辑,而不需要了解其他对象的细节。
  4. 可以集中管理和控制对象之间的交互:中介者作为协调者,可以集中管理和控制对象之间的交互行为,提供更灵活和可控的系统设计。
    缺点:
  5. 中介者对象的复杂性:中介者对象需要处理各个对象之间的交互逻辑,可能会变得复杂,导致中介者对象本身变得庞大和难以维护。
  6. 增加了系统的单点故障:中介者对象承担了集中管理和控制对象之间交互的责任,一旦中介者对象出现问题,整个系统的稳定性可能会受到影响。
  7. 可能导致性能问题:由于中介者模式集中了对象之间的交互行为,可能会导致中介者成为系统的瓶颈,影响系统的性能。

总结:

中介者模式通过引入中介者对象来解耦对象之间的关系,简化了对象的交互,提供了更灵活和可控的系统设计。然而,中介者对象的复杂性和系统的单点故障可能会带来一些问题。在使用中介者模式时,需要权衡其优缺点,确保合理使用。

你可能感兴趣的:(设计模式学习,设计模式,中介者模式,java)