【设计模式】中介模式

目录

什么是中介模式

中介模式的组成

使用场景:

优点:

缺点:

Java 示例代码:


什么是中介模式

Java 中的中介模式(Mediator Pattern)是一种行为型设计模式,旨在降低多个对象和类之间的通信复杂性。通过这种模式,对象之间不直接通信,而是通过一个中介对象来协调他们之间的交互。这有助于减少系统中组件的相互依赖性,从而提高组件的可重用性和可维护性。

中介模式的组成

  1. 中介者接口(Mediator):定义了用于通信的方法,可以是接口或抽象类。
  2. 具体中介者(Concrete Mediator):实现中介者接口,并协调多个不同组件之间的交互。具体中介者知道所有的具体同事类,并从具体同事接收消息,向它们发送命令。
  3. 同事类(Colleague):与其他对象交互时,不是直接通信,而是通过中介者来交互。

使用场景:

  • 当多个类相互交互形成网状结构时,使用中介模式可以将网状结构转化为以中介者为核心的星型结构。
  • 减少类之间的依赖,降低耦合度。
  • 当一个对象群的行为是互相协作的紧密型群体时,可以通过中介者封装这些交互。

优点:

  • 减少了类间的直接通讯,降低了系统的复杂性。
  • 有助于单一职责原则,可以将交互的管理和协调职责委托给中介者对象。
  • 更容易理解和维护系统中的交互。

缺点:

  • 中介者可能会变得过于复杂,自身成为一个难以维护的大类。
  • 有可能过度使用,使得一些本可以直接通信的类也通过中介者来通信,可能引入不必要的复杂性。

Java 示例代码:

        这里是一个简单的中介者模式实现的例子,展示如何在聊天室中使用中介者模式来交流:

// 中介者接口
interface ChatMediator {
    void sendMessage(String msg, User user);
    void addUser(User user);
}

// 具体中介者
class ChatRoom implements ChatMediator {
    private List<User> users;

    public ChatRoom(){
        this.users = new ArrayList<>();
    }

    @Override
    public void sendMessage(String msg, User user) {
        for(User u : users){
            // 不发送消息给自己
            if(u != user){
                u.receive(msg);
            }
        }
    }

    @Override
    public void addUser(User user) {
        this.users.add(user);
    }
}

// 同事类
abstract class User {
    protected ChatMediator mediator;
    protected String name;

    public User(ChatMediator med, String name){
        this.mediator = med;
        this.name = name;
    }

    public abstract void send(String msg);

    public abstract void receive(String msg);
}

// 具体同事类
class ConcreteUser extends User {
    public ConcreteUser(ChatMediator med, String name) {
        super(med, name);
    }

    @Override
    public void send(String msg) {
        System.out.println(this.name + ": Sending Message = " + msg);
        mediator.sendMessage(msg, this);
    }

    @Override
    public void receive(String msg) {
        System.out.println(this.name + ": Received Message = " + msg);
    }
}

public class Main {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatRoom();
        User user1 = new ConcreteUser(mediator, "John");
        User user2 = new ConcreteUser(mediator, "Doe");
        mediator.addUser(user1);
        mediator.addUser(user2);
        user1.send("Hi there!");
        user2.send("Hello!");
    }
}

         在这个示例中,ChatRoom 充当中介者,User 和其子类 ConcreteUser 充当同事类。通过中介者,同事类之间能够交换消息,而无需直接互相引用。

        非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~

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

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

相关文章

安全特低电压 SELV(Safety Extra Low Voltage,缩写SELV) 是不接地系统的安全特低电压

SELV LED驱动器 市场上有很多LED灯是非隔离的&#xff0c;甚至还有灯条要100多伏特电压才能点亮的&#xff0c;安全吗&#xff1f; 国外多数LED驱动器标注了SELV&#xff0c;为什么&#xff1f; 安全特低电压 SELV(Safety Extra Low Voltage&#xff0c;缩写SELV) 是不接地系…

谈谈前端CSS盒模型

前言&#xff1a; 什么是CSS盒模型&#xff1f;盒模型的构造&#xff1f; 在前端开发中&#xff0c;CSS 盒模型是一种非常基础且核心的概念&#xff0c;它描述了文档中的每个元素被框架处理的方式。 ---- 打开浏览器开发者工具&#xff0c;查看Elements右侧下的Styles底部。 …

上手GitHub Copilot让AI写代码,效率飞起!

1 GitHub Copilot介绍 GitHub Copilot 由 GitHub 和 OpenAI 共同开发的人工智能代码辅助工具&#xff0c;可自动地生成高质量代码片段、上下文信息等。通过自然语言处理和机器学习技术&#xff0c;通过分析程序员编写的代码、注释和上下文信息&#xff0c;自动生成代码&#x…

【JAVA】UDP与TCP套接字编程

目录 一、UDP数据报套接字编程 1、DatagramSocket API 2、DatagramPacket API 3、InetSocketAddress API 4、示例一 5、示例二 二、TCP流套接字编程 1、ServerSocket API 2、Socket API 3、TCP中的长短连接 4、示例一 5、示例二 一、UDP数据报套接字编程 1、Datag…

山岭隧道及道路3D建模教程【Blender】

创建具有恒定坡度的山路、隧道的信息和技术似乎散布在互联网上。 在这篇文章中&#xff0c;我将它们全部收集在一起。 这篇文章的大纲如下&#xff1a; 创建一座山创建一条路挖一条隧道 道路的坡度将固定为常数&#xff0c;从而消除颠簸。 NSDT工具推荐&#xff1a; Three.j…

yolo-驾驶行为监测:驾驶分心检测-抽烟打电话检测

在现代交通环境中&#xff0c;随着汽车技术的不断进步和智能驾驶辅助系统的普及&#xff0c;驾驶安全成为了公众关注的焦点之一 。 分心驾驶&#xff0c;尤其是抽烟、打电话等行为&#xff0c;是导致交通事故频发的重要因素。为了解决这一问题&#xff0c;研究人员和工程师们…

Nginx目录浏览

类似 在nginx的配置文件中的server内配置&#xff0c;想给哪个网站开启&#xff0c;就在该网站的server中配置 server {listen 81;server_name localhost;autoindex on; # 开启目录浏览功能。autoindex_exact_size off; # 显示文件大小的时候带单位location / {root …

美国站群服务器的SEO优化策略助力提升网站流量?

美国站群服务器的SEO优化策略助力提升网站流量? 在当今数字化时代&#xff0c;网站的成功与否与其在搜索引擎结果页面上的排名密切相关。对于那些利用美国站群服务器运营多个网站的企业来说&#xff0c;通过SEO优化策略提升网站流量成为了至关重要的任务。然而&#xff0c;要…

最大层内元素和

题目链接 最大层内元素和 题目描述 注意点 返回层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个树中的节点数在 [1, 10000]范围内-10^5 < Node.val < 10^5 解答思路 广度优先遍历树&#xff0c;使用队列存…

如何有效地进行汽车制造业文件共享,一文了解

随着数字化转变&#xff0c;企业的业务文件大多通过电子形式在内外部流转。这增加了外发文件数据泄露或被篡改的风险&#xff0c;如何保护外发文件安全已成为企业不容忽视的课题。其中汽车制造业是一个高度依赖文件共享与协作的行业&#xff0c;涉及设计图纸、技术文件、供应链…

TI API ,详情见ti.com

TI API &#xff0c;详情见ti.com TI API 接口开发&#xff0c;实现货品查询、查询订单、自动下单、抢购等功能。

Open Footprint®论坛数据模型Snapshot发布,与您全‘绿’以赴!

正值第55个“&#x1f30d;世界地球日”&#xff0c;The Open Group Open Footprint论坛很高兴地正式宣布《Open Footprint数据模型Snapshot》”的可用性。我们的期望是&#xff0c;一旦被广泛采用&#xff0c;数据模型将大大缓解内部以及范围3排放数据共享问题&#xff0c;有效…

IntelliJ IDEA2020下使用Maven构建Scala 项目

1.创建maven文件 2.进入pom.xml导入依赖 <!--添加spark的依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.1</version></dependency><!--添加scala依…

羊大师解析,夏日消暑羊奶来帮忙

羊大师解析&#xff0c;夏日消暑羊奶来帮忙 炎炎夏日&#xff0c;烈日当空&#xff0c;人们总是寻找各种方式来消暑降温。除了常见的冷饮、空调等&#xff0c;其实还有一种天然、健康的饮品可以帮助我们度过酷暑——那就是羊奶。 羊奶作为一种营养丰富的天然饮品&#xff0c;不…

一文带你掌握yaml文件的使用

在自动化测试数据存储中&#xff0c;比较常见的有csv、json、excel文件等&#xff0c;可能大家忽略了另外一个非常简单、好用的&#xff0c;而且更简洁的文件&#xff0c;那就是咱们今天的主角yaml文件。 yaml文件是一种数据序列化语言&#xff0c;其良好的跨语言、跨平台、易…

CST电磁仿真软件的激励设置和使用场导入【基础教程】

设置平面波激励 确认平面波的特性&#xff01; Simulation > Sources and Loads > Plane Wave 通过Plane Wave在远离观测对象的位置接通场源(Field Source)&#xff0c;进行入射波的仿真分析该功能主要在RCS(Radar Cross Section)和EMS(Electromagnetic Susceptibilit…

vuex数据永久存续

第一步下载 vuex 并创建store下js文件 第二步 npm install vuex-persistedstate 第三步 引用 vuex-persistedstate 配置 plugins 项 import createPersistedState from vuex-persistedstateplugins:[createPersistedState({//存储方式&#xff1a;localStorage\sessionStor…

Linux - tar (tape archive)

tar 的全称是 Tape Archive。它最初是在 Unix 系统中用于将数据写入磁带的工具&#xff0c;但现在它通常用于创建、维护、修改和提取文件的归档文件。尽管 tar 可以用于压缩和解压缩文件&#xff0c;但它本身并不进行压缩&#xff0c;而是通常与 gzip 或 bzip2 等压缩工具一起使…

阿赵UE学习笔记——29、Niagara制作火焰效果

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;之前简单介绍了Niagara粒子系统&#xff0c;这次用Niagara系统做一个火焰的效果。 一、创建发射器 和之前介绍的一样&#xff0c;先创建一个空白的发射器&#xff1a; 我把这个发射器命名为…

如何利用亚马逊云科技上的Amazon Bedrock构建负责任的AI?

AI安全是最近非常热门的话题&#xff0c;无论是训练数据全生命周期保护、模型安全、AI安全与合规等&#xff0c;今天我们来介绍一个新兴的AI安全话题—负责任(Responsible)的AI 1️⃣什么是负责任的AI&#xff1f; 所谓负责任&#xff0c;就是通过构建AI治理框架&#xff0c;让…
最新文章