探索Java设计模式:中介者模式

全面解读与实践Java设计模式之中介者模式

一、简要介绍

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介者对象来协调多个对象之间的交互关系,从而降低对象间的耦合度。在复杂系统中,如果多个对象之间存在大量的直接交互,会导致对象间关系错综复杂,难以维护。中介者模式通过集中处理对象间的交互逻辑,将原本复杂的网状结构简化为星形结构,使得对象各自关注自身的业务逻辑,而将跨对象的通信委托给中介者处理。

二、实现示例

以下是一个基于办公室自动化系统的中介者模式实现示例,展示了如何使用中介者来协调打印机、扫描仪、电脑等办公设备间的交互:

// 中介者接口
interface OfficeAutomationMediator {
    void registerDevice(OfficeDevice device);
    void sendMessage(String from, String to, String message);
}

// 具体中介者类
class SmartHub implements OfficeAutomationMediator {
    private Map<String, OfficeDevice> devices;

    public SmartHub() {
        devices = new HashMap<>();
    }

    @Override
    public void registerDevice(OfficeDevice device) {
        devices.put(device.getName(), device);
    }

    @Override
    public void sendMessage(String from, String to, String message) {
        OfficeDevice sender = devices.get(from);
        OfficeDevice receiver = devices.get(to);
        if (sender != null && receiver != null) {
            sender.send(message, receiver);
        }
    }
}

// 设备接口及具体设备类
interface OfficeDevice {
    String getName();
    void send(String message, OfficeDevice receiver);
    void receive(String message);
}

class Printer implements OfficeDevice {
    private String name = "Printer";

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void send(String message, OfficeDevice receiver) {
        System.out.println(name + " sends: " + message + " to " + receiver.getName());
        mediator.sendMessage(name, receiver.getName(), message);
    }

    @Override
    public void receive(String message) {
        System.out.println(name + " receives: " + message);
        // 执行打印操作...
    }

    private OfficeAutomationMediator mediator;

    public void setMediator(OfficeAutomationMediator mediator) {
        this.mediator = mediator;
    }
}

// 类似地,定义Scanner和Computer类...

// 客户端代码
public class Client {
    public static void main(String[] args) {
        OfficeAutomationMediator mediator = new SmartHub();

        Printer printer = new Printer();
        Scanner scanner = new Scanner();
        Computer computer = new Computer();

        printer.setMediator(mediator);
        scanner.setMediator(mediator);
        computer.setMediator(mediator);

        mediator.registerDevice(printer);
        mediator.registerDevice(scanner);
        mediator.registerDevice(computer);

        computer.send("Print document", printer); // Computer sends: Print document to Printer
                                                  // Printer receives: Print document
    }
}

在这个例子中,我们定义了OfficeAutomationMediator接口作为中介者,SmartHub是具体的中介者实现,负责管理设备注册与消息传递。OfficeDevice接口和PrinterScannerComputer等具体设备类代表办公室内的各种设备,它们通过中介者进行通信。客户端代码创建中介者和设备对象,并通过中介者协调设备间的交互。

三、实际运用

中介者模式在实际开发中有多种应用场景,以下列举几个典型例子:

  1. 用户界面组件:在GUI应用中,不同UI组件间的交互可以通过中介者模式进行统一管理。例如,按钮点击事件可能需要更新文本框、列表视图等多个组件的状态,此时可以使用中介者集中处理这些交互逻辑。

  2. 消息传递系统:在分布式系统中,消息队列或事件总线可以充当中介者角色,负责转发和路由消息,使得发送者和接收者无需了解对方的存在和位置。

  3. 模块间通信:在大型软件项目中,不同模块间可能存在复杂的依赖关系。通过引入中介者,可以将模块间的直接交互替换为与中介者的交互,简化模块间的耦合,提高系统的可维护性和扩展性。

  4. 游戏开发:在多人在线游戏中,游戏服务器可以作为中介者,处理玩家之间的交互,如聊天、交易、战斗等,避免玩家对象间的直接通信。

总结来说,中介者模式通过引入中介者对象来协调多个对象间的交互,有效地降低了对象间的耦合度,简化了系统结构。在实际开发中,应识别出系统中的“多对多”交互关系,适时地运用中介者模式进行设计,以提升代码的可读性、可维护性和扩展性。同时,中介者模式也有助于集中处理特定类型的交互逻辑,如错误处理、权限检查等,提高系统的整体一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/572483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI-数学-高中-44导数的运算法则

原作者视频&#xff1a;【导数】【一数辞典】3导数的运算法则&#xff08;略难&#xff09;_哔哩哔哩_bilibili 三种求导表达方式一样的&#xff0c;中间的比较常用&#xff1a; 链式法则&#xff1a;从外向内&#xff1a;

Vue3 实现 Three.js粒子特效

效果 <template><div id"waves" /> </template><script setup> import { ref, onMounted, onUnmounted } from "vue"; import * as THREE from "three";const amountX ref(50); const amountY ref(50); const color …

MATLAB实现蚁群算法栅格路径优化

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法&#xff0c;常用于解决路径规划问题。在栅格路径优化中&#xff0c;蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤&#xff1a; 初始化参数&#xff1a; (1)设置蚂蚁数量&#xff…

JavaScript实现代码雨

一、功能描述 使用canvas实现一个代码雨的功能&#xff0c;炫一个~~~ 二、上码 html <canvas id"canvas"></canvas> js let canvas document.querySelector(canvas);let ctx canvas.getContext(2d);// screen.availWidth:可视区域的宽度canvas.width…

Blender游戏资产优化技巧

创建视频游戏资产既具有挑战性又富有回报。 经过一些研究并根据我的经验&#xff0c;这里有三个技巧可以帮助你使用 Blender 优化游戏资产。 在 Blender 中优化游戏资源的三种技术可以归结为拥有高效的 3D 模型拓扑、通过烘焙优化纹理&#xff0c;以及最后通过 Blender 节点的…

【Spring AI 来了】

spring官方已经有Spring AI 插件&#xff0c;每个程序员必定拥抱AI&#xff0c;也意味着不就以后AI的open API 会成为我们开发成的基础jdk。 下面的内容也是AI直接根据网址给我翻译的&#xff0c;连格式都是生成的。AI应用已经渗透到各行各业了&#xff0c;并且会改变我们每个…

【八股】Java基础、集合、JVM

面向对象三大特性 1 封装&#xff1a; 将 方法 和 属性 写到同一个类中&#xff0c;并将属性 私有化&#xff0c;生成 get set方法&#xff0c;外部访问属性需要通过get和set方法,内部可以直接访问属性&#xff0c;这样的一个类我们认为它完成了封装。 2 继承&#xff1a; 子…

神经网络手写数字识别

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计4077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

python安装pytorch@FreeBSD

先上结论&#xff0c;最后在conda下安装成功了&#xff01; PyTorch是一个开源的人工智能深度学习框架&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&#xff09;基于Torch库开发并维护。PyTorch提供了一个高效、灵活且易于使用的工具集&#xff0c;用于构建和训练深…

Python-VBA函数之旅-iter函数

目录 一、iter函数的常见应用场景&#xff1a; 二、iter函数使用注意事项&#xff1a; 三、如何用好iter函数&#xff1f; 1、iter函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 …

AndroidStudio 新建工程的基本修改及事件添加

注&#xff1a;2022.3.1&#xff0c;新建Empty Activity默认是Kotlin&#xff0c;可以选择新建Empty View Activity&#xff0c;修改语言为JAVA 应用名称 修改应用名称 路径&#xff1a;res-values-strings.xml 是否显示应用名称 路径&#xff1a;res-values-themes.xml …

SpringMVC基础篇(一)

文章目录 1.基本介绍1.特点2.SpringMVC跟SpringBoot的关系 2.快速入门1.需求分析2.图解3.环境搭建1.创建普通java工程2.添加web框架支持3.配置lib文件夹1.导入jar包2.Add as Library3.以后自动添加 4.配置tomcat1.配置上下文路径2.配置热加载 5.src下创建Spring配置文件applica…

React.js 3D开发快速入门

如果你对 3D 图形的可能性着迷&#xff0c;但发现从头开始创建 3D 模型的想法是不可能的 - 不用担心&#xff01; Three.js 是一个强大的 JavaScript 库&#xff0c;它可以帮助我们轻松地将现有的 3D 模型集成到 React 应用程序中。因此&#xff0c;在本文中&#xff0c;我将深…

Educational Codeforces Round 164 (Rated for Div. 2) A-E

A. Painting the Ribbon 暴力模拟即可 #include <bits/stdc.h>using namespace std; const int N 2e5 5; typedef long long ll; typedef pair<ll, ll> pll; typedef array<ll, 3> p3; // int mod 998244353; const int maxv 4e6 5; // #define endl &…

ICCV2023人脸识别TransFace论文及代码学习笔记

论文链接&#xff1a;https://arxiv.org/pdf/2308.10133.pdf 代码链接&#xff1a;GitHub - DanJun6737/TransFace: Code of TransFace 背景 尽管ViTs在多种视觉任务中展示了强大的表示能力&#xff0c;但作者发现&#xff0c;当应用于具有极大数据集的人脸识别场景时&#…

Leaflet实现离线地图展示,同时显示地图上的坐标点和热力图

在实际工作中,因为部署环境的要求,必须使用离线地图,而不是调用地图接口。我们应该怎么解决这种项目呢? 下面介绍一种解决该问题的方案:Leaflet+瓦片地图 一、Leaflet Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库。 它大小仅仅只有 42 KB of JS, 并且拥…

opencv图片绘制图形-------c++

绘制图形 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>bool opencvTool::drawPolygon(std::string image_p, std::vector<cv::Point> points) {cv::Mat ima cv::imread(image_p.c_str()); // 读取图像&#xf…

如何调节电脑屏幕亮度?让你的眼睛更舒适!

电脑屏幕亮度的调节对于我们的视力保护和使用舒适度至关重要。不同的环境和使用习惯可能需要不同的亮度设置。可是如何调节电脑屏幕亮度呢&#xff1f;本文将介绍三种不同的电脑屏幕亮度调节方法&#xff0c;帮助您轻松调节电脑屏幕亮度&#xff0c;以满足您的需求。 方法1&…

C++必修:从C到C++的过渡(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 缺省参数 1.1. 缺省参数的使用 缺省参数是声明或定义函数时为函数的参数指定…

直接插入排序与希尔排序的详解及对比

目录 1.直接插入排序&#xff08;至少有两个元素才可以使用&#xff09; 排序逻辑 B站动画演示&#xff1a;直接插入排序 逻辑转为代码&#xff1a; 稳定性&#xff1a;稳定 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) 应用场景 2.希尔排序&#xff08;对…