Java 设计模式——中介者模式

目录

  • 1.概述
  • 2.结构
  • 3.案例实现
    • 3.1.抽象中介类
    • 3.2.抽象同事类
    • 3.3.具体同事类
    • 3.4.具体中介类
    • 3.5.测试
  • 4.优缺点
  • 5.使用场景

1.概述

(1)一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有 6 个同事类对象,假如对象 1 发生变化,那么将会有 4 个对象受到影响。如果对象 2 发生变化,那么将会有 5 个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。

(2)如果引入中介者模式,那么同事类之间的关系将变为星型结构,从下右图中可以看到,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为

在这里插入图片描述

(3)中介者模式 (Mediator Pattern) 是一种行为型设计模式,它允许对象通过一个中介对象来进行协作,而不是直接相互引用,从而降低对象之间的耦合度,同时提高代码的可维护性和可扩展性

2.结构

中介者模式包含以下主要角色:

  • 抽象中介者 (Mediator) 角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  • 具体中介者 (Concrete Mediator) 角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  • 抽象同事类 (Colleague) 角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  • 具体同事类 (Concrete Colleague) 角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

3.案例实现

【例】租房:现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。其类图下:
在这里插入图片描述
具体实现代码如下:

3.1.抽象中介类

Mediator.java

//抽象中介者类
public abstract class Mediator {
    public abstract void constact(String message, Person person);
}

3.2.抽象同事类

Person.java

//抽象同事类
public abstract class Person {
    protected String name;
    protected Mediator mediator;
    
    public Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}

3.3.具体同事类

//租房者
public class Tenant extends Person{
    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }
    
    //和中介沟通的方法
    public void constact(String message){
        mediator.constact(message, this);
    }
    
    //获取信息
    public void getMessage(String message){
        System.out.println("租房者" + name + "获取到的信息是:" + message);
    }
}

HouseOwner.java

//房主类
public class HouseOwner extends Person{
    public HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }
    
    //和中介沟通的方法
    public void constact(String message){
        mediator.constact(message,this);
    }
    
    //获取信息
    public void getMessage(String message){
        System.out.println("房主" + name + "获取到的信息是:" + message);
    }
}

3.4.具体中介类

MediatorStructure.java

//具体的中介者角色类
public class MediatorStructure extends Mediator {

    //聚合房主和具体的租房者对象
    private HouseOwner houseOwner;
    private Tenant tenant;

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    @Override
    public void constact(String message, Person person) {
        if (person == houseOwner) {
            tenant.getMessage(message);
        } else {
            houseOwner.getMessage(message);
        }
    }
}

3.5.测试

Client.java

public class Client {
    public static void main(String[] args) {
        //创建中介者对象
        MediatorStructure mediator = new MediatorStructure();
    
        //创建租房者对象
        Tenant tenant = new Tenant("李四", mediator);
        //创建房主对象
        HouseOwner houseOwner = new HouseOwner("张三", mediator);
    
        //中介者要知道具体的房主和租房者
        mediator.setTenant(tenant);
        mediator.setHouseOwner(houseOwner);
    
        tenant.constact("我要租三室的房子!");
        houseOwner.constact("我这里有三室的房子,你要租吗?");
    }
}

输出结果如下:

房主张三获取到的信息是:我要租三室的房子!
租房者李四获取到的信息是:我这里有三室的房子,你要租吗?

4.优缺点

(1)中介者模式的优点包括:

  • 减少对象之间的直接耦合:通过引入中介者对象,各个对象不再直接相互引用,而是通过中介者来协调和管理交互,从而降低了对象之间的依赖程度。
  • 简化对象的交互逻辑:中介者模式将对象之间的交互行为集中在中介者对象中实现,各个对象只需要与中介者进行通信,不需要了解其他对象的具体细节,从而简化了对象之间的交互逻辑。
  • 提高系统的可维护性和可扩展性:通过降低对象之间的耦合度,中介者模式使系统更加灵活和易于维护。当系统需要新增一些交互行为时,只需要修改中介者对象即可,无需修改各个同事对象。
  • 促进代码重用:中介者模式可以将对象之间公共的交互行为抽象到中介者对象中,从而可以更好地复用代码。

(2)中介者模式的缺点包括:

  • 中介者对象可能会变得复杂:随着系统中的对象和交互行为增多,中介者对象可能会承担过多的责任,变得复杂和庞大。
  • 中介者模式可能导致性能问题:因为所有的交互行为都通过中介者进行,所以中介者可能成为系统的瓶颈,导致性能问题。
  • 增加了系统的复杂性:中介者模式增加了一个新的抽象层次,引入了中介者对象,使系统的架构更加复杂,对于简单的交互行为并不适用。

(3)所以在使用中介者模式时,需要权衡其优势和缺点,并根据具体情况进行选择。它适用于对象之间的交互关系复杂、需要集中管理和协调的场景,但对于简单的交互行为,可能会过于繁琐和不必要。

5.使用场景

(1)中介者模式适用于以下场景:

  • 对象之间的交互关系复杂:当系统中的对象之间存在复杂的交互关系,很难直接进行管理和协调时,可以引入中介者模式来简化和集中管理对象之间的交互行为。
  • 需要减少对象之间的耦合度:当对象之间的直接引用和依赖关系较多,难以维护和扩展时,可以使用中介者模式来解耦对象之间的关系,通过统一的中介者来进行交互。
  • 多个对象共享一些公共行为或信息:当多个对象需要共享某些公共行为或信息,并且希望集中管理和协调这些行为或信息时,可以使用中介者模式。
  • 多个对象之间的交互频繁:当多个对象之间频繁进行交互,且存在复杂的交互逻辑时,可以使用中介者模式来简化交互过程,提高代码的可维护性和可扩展性。

(2)一些常见的应用中介者模式的场景包括:

  • 图形界面中的 MVC 模式:在 MVC 模式中,中介者模式用于协调视图、模型和控制器之间的交互。
  • 多人在线游戏系统:在多人在线游戏中,中介者模式可以用于处理玩家之间的交互、通信和协作。
  • 航空管制系统:在航空管制系统中,中介者模式可以用于协调不同飞机之间的通信、路径规划和冲突解决。
  • UI 组件库:在构建 UI 组件库或框架时,中介者模式可以用于统一管理组件之间的交互行为,从而提供统一的接口和规范。

(3)总之,中介者模式适用于需要集中管理和协调对象之间交互关系的复杂场景,以提高系统的灵活性、可维护性和可扩展性。

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

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

相关文章

IDEA这样配置Maven:让你一遍就能学会!

一、安装Maven环境 1.1 下载并安装Maven Maven官网:http://maven.apache.org/download.cgi 建议放在非系统盘目录下,可在根目录新建(D:/maven)目录用于存放Maven,或者如图,路径中不要有中文。 1.2 配置M…

AIGC实战——变分自编码器(Variational Autoencoder, VAE)

AIGC实战——变分自编码器 0. 前言1. 变分自编码器1.1 基本原理1.2 编码器 2. 构建VAE编码器2.1 Sampling 层2.2 编码器2.3 损失函数2.4 训练变分自编码器 3. 变分自编码器分析小结系列链接 0. 前言 我们已经学习了如何实现自编码器,并了解了自编码器无法在潜空间中…

轻量封装WebGPU渲染系统示例<33>- 单精度浮点纹理(源码)

在WebGPU中创建纹理使用纹理很方便,只是js中只有Float32Array而默认不支持Float16Array,所以略微费点事。不过网上的大神多的是,摇摇小手就能获得解决方案。 废话多了容易挨胖揍,看代码。 js中float16单精度float数值转换: // …

[C/C++] 数据结构 链表OJ题:相交链表(寻找两个链表的相交起始结点)

题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返…

JSP 购物商城系统eclipse定制开发mysql数据库BS模式java编程servlet

一、源码特点 java 购物商城系统是一套完善的web设计系统 系统采用serlvetdaobean 模式开发,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,eclipse开发,数…

CentOS停更在即,国内厂商该如何应对?KeyarchOS X2Keyarch 迁移体验

一、CentOS 停更危机二、关于浪潮信息KeyarchOS三、浪潮信息 KeyarchOS License 应用迁移实践第一步:迁移前验证第二步:迁移第三步:迁移后验证 四、写在最后 一、CentOS 停更危机 自 1993 年开始,红帽 Linux 已经陪伴开发者们走过…

荧光量子效率积分球检测薄膜需要注意什么

荧光量子效率积分球是一种特殊的积分球,它可以用于测量荧光材料在特定波长下的荧光量子效率。它由一个具有高朗伯特性的漫反射材料制成,具有高达99%的反射率和朗伯特性。荧光量子效率积分球的使用方法包括将样品放置在积分球的样品口中,调整激…

【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 map和set 1. 前言2. map和set介绍3. pair结构介…

JWT登录认证(1登录)

JwtUtil package com.lin.springboot01.utils; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import java.util.Date; import java.util.Map;public class JwtUtil {private static final String KEY "liner2332";//接受业务数据&#xf…

Python in Visual Studio Code 2023年11月发布

排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 11 月发布! 此版本包括以下公告: 改进了使用 Shift Enter 在终端中运行当前行弃用内置 linting 和格式设置功能对 Python linting 扩展的改进重…

linux安装nginx并配置服务的详细步骤

文章目录 依赖安装安装gcc环境安装 pcre安装zlib安装openssl 安装Nginx在nginx官网下载安装包将安装包上传linux解压文件手动创建用户和用户组编译目录编译源码并安装启动查看进程 设置nginx服务并开机自启 依赖安装 nginx安装前需要一些依赖,如果已经安装了则忽略…

大数据Doris(二十三):取消导入与其他导入案例参考

文章目录 取消导入与其他导入案例参考 一、取消导入

Django(七、模型层)

文章目录 模型层模型层前期准备使用django ORM要注意 代码演示:切换MySQL数据库如何查看django ORM 底层原理? 单表操作模型层之ORM常见关键字基础的增删改查常用的关键字 常见的十几种查询基于双下滑线的查询 模型层 模型层前期准备 使用django ORM要…

【Qt之QWizardPage】使用

介绍 QWizardPage类是向导页面的基类。 QWizard表示一个向导。每个页面都是一个QWizardPage。当创建自己的向导时,可以直接使用QWizardPage,也可以子类化它以获得更多控制。 页面具有以下属性,由QWizard呈现:a title,…

【数据结构】别跟我讲你不会冒泡排序

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

【Python 千题 —— 基础篇】列表的最大值与最小值(for 循环版)

题目描述 题目描述 输出列表的最大值与最小值。题中有一个包含数字的列表 [11, 39, 100, 48, 392, 10, 9],使用 for 循环输出这个列表的最大值与最小值。 输入描述 无输入。 输出描述 输出列表的最大值与最小值。 示例 示例 ① 输出: 列表的最…

如何在Ubuntu 23.10部署KVM并创建虚拟机?

正文共:1114 字 21 图,预估阅读时间:2 分钟 我们之前对OpenStack醉过一次简单介绍(什么是OpenStack?),OpenStack本身是一个云管理平台,它本身并不提供虚拟化功能,而是依赖…

UE基础必学系列:UMG

一、教程: 官方教程: 官方文档: 创建和显示UI 二、理解知识点: 2.1 RemoveFromParent 从视口中删除,但仍保留在内存中,并且变量仍然存在有效的 2.2 3D交互组件测试

webstorm/idea配置leetcode刷题

File -> settings -> Plugins -> 搜索leetcode 安装插件(截图显示我已经安装过了),安装完成后点击OK操作,在编辑器四个边角就会出现一个leetcode的插件 File -> settings -> Tools-> Leetcode plugin 点击…

表单校验wed第十九章

常见的表单验证 一。表单选择器 属性过滤选择器 :selected 选中所有的下拉元素 :checked:选项元素 :disabled 不可用元素 :enable 所有可用元素 二。字符串演示 1.判断非空 isNaN(j) :判断是否为数字 2.表…