设计模式:中介者模式

2023-09-17 16:23:06

中介者模式(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. 可能导致性能问题:由于中介者模式集中了对象之间的交互行为,可能会导致中介者成为系统的瓶颈,影响系统的性能。

总结:

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

更多推荐

容器【容器介绍、Set接口介绍、 HashSet容器的使用、TreeSet容器的使用】(三)-全面详解(学习总结---从入门到深化)

目录LinkedList容器介绍Set接口介绍HashSet容器的使用通过HashSet存储自定义对象TreeSet容器的使用LinkedList容器介绍LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一

SOLIDWORKS PDM—数据库的备份计划

SOLIDWORKS产品数据管理(PDM)解决方案可帮助您控制设计数据,并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用SOLIDWORKSPDMProfessional,您的团队能够:1.安全地存储和索引设计数据以实现快速检索;2.打消关于版本控制和数据丢失的顾虑;3.与多个地点的组织内外部的人员就设计进

Docker+jenkinsPipeline运行实现python自动化测试(超详细)

一、实现思路在Linux服务器安装docker创建jenkins容器jenkins中创建pipeline项目根据自动化项目依赖包构建python镜像(构建自动化python环境)运行新的python容器,执行jenkins从仓库中拉下来的自动化项目执行完成之后删除容器二、环境准备Linux服务器一台(我的是CentOS

[Docker精进篇] Docker镜像构建和实践 (三)

前言:Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中,以便在不同环境中快速、可靠地部署和运行应用程序。文章目录Docker镜像构建1️⃣是什么?2️⃣为什么?3️⃣镜像构建一、用现有容器构建新镜像二、Dockerfile构建镜像4️⃣总结这篇文章是我的笔记,旨在带您快速入门上手docke

Docker进阶:Docker Compose(容器编排) 管理多容器应用—实战案例演示

Docker进阶:DockerCompose(容器编排)管理多容器应用—实战案例演示一、DockerCompose简介二、DockerCompose安装三、DockerCompose卸载四、DockerCompose核心概念4.1、一文件原则(docker-compose.yml)4.2、服务(service)4.3、

PostgreSQL快速入门 & 与MySQL语法比较

开篇本文可帮助具有MySQL基础的小伙伴对PostgreSQL做一个快速的入门,通过语法之间的差异对比,降低学习成本,同样都是数据库,正所谓触类旁通。模式的概念模式(Schema)表示数据库中的逻辑容器,用于组织和管理数据库对象,如表、视图、索引等。一个模式可以看作是一组相关对象的命名空间。模式不同于表,它更多地是对数

【Docker系列】Docker-核心概念/常用命令与项目部署实践

写在前面Docker是一种开源的容器化技术,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,从而实现快速部署和高效运行。Docker的核心概念包括镜像、容器、仓库等。本文将详细介绍Docker的基本概念、安装方法以及常用命令。一、Docker基本概念介绍3个基础概念:镜像(Image)容器(Conta

JVM——2.JVM的内存结构

这篇文章来讲一下JVM中的重点之一——JVM的内存结构目录1.概述2.程序计数器3.虚拟机栈3.1栈的介绍3.2栈的相关问题3.3栈内存溢出问题3.4线程运行诊断4.本地方法栈5.堆5.1堆的概述5.2堆内存溢出问题5.3堆内存诊断6.方法区6.1方法区的概述6.2方法区的内存溢出问题7.运行时常量池8.直接内存8.1

在 Swift 中使用 async let 并发运行后台任务

文章目录前言长期运行的任务阻塞了UI使用async/await在后台执行任务在后台执行多个任务使用"asynclet"下载多个文件结论前言Async/await语法是在Swift5.5引入的,在WWDC2021中的Meetasync/awaitinSwift对齐进行了介绍。它是编写异步代码的一种更可读的方式,比调度队列

基于yolov5的交通标志牌的目标检测研究设计——思路及概念

有需要项目的可以私信博主!!!!!一、选题的目的、意义及研究现状(1)选题的目的和意义随着人们对道路安全性的重视和城市交通量的不断增加,交通标志牌作为道路交通安全的重要组成部分之一,扮演着十分重要的角色。然而,交通标志牌的数量庞大、种类繁多,人工巡视的方式存在效率低、漏检率高等问题,对道路交通的安全性带来了一定的隐患。

Vue模板语法(下)

一.事件处理器什么是事件处理器建立一个HTML编写事件处理器测试结果二.表单的综合案例什么是表单综合案例建立一个HTML来编写表单案例测试结果三.局部组件什么是组件通信自定义组件测试结果组件通信-父传子测试结果组件通信-子传父测试结果一.事件处理器什么是事件处理器事件处理器是一种用于响应和处理用户交互事件的机制。在We

热文推荐