【Java 设计模式】行为型之中介者模式_java 设计模式 colleague mediator-程序员宅基地

技术标签: java  中介者模式  设计模式  


中介者模式(Mediator Pattern)是一种行为型设计模式,用于通过一个中介对象来集中管理多个对象之间的交互关系,从而降低对象之间的耦合度。中介者模式通过将对象之间的通信委托给中介者,使得对象之间不直接相互通信,而是通过中介者来进行交互。在本文中,我们将深入研究Java中中介者模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

中介者模式是一种行为型设计模式,用于通过一个中介对象来集中管理多个对象之间的交互关系,从而降低对象之间的耦合度。中介者模式通过将对象之间的通信委托给中介者,使得对象之间不直接相互通信,而是通过中介者来进行交互。中介者模式通常包含三个主要角色:抽象中介者(Abstract Mediator)、具体中介者(Concrete Mediator)、同事类(Colleague)。

  • 抽象中介者(Abstract Mediator): 定义了中介者的接口,负责定义同事类之间的通信方法
  • 具体中介者(Concrete Mediator): 实现了抽象中介者的接口,负责管理和协调同事类之间的交互
  • 同事类(Colleague): 每个同事类都知道中介者对象,并与中介者对象通信,但不知道其他同事类的存在

2. 应用场景

中介者模式通常在以下场景中使用:

  • 一组对象之间存在复杂的交互关系:

    当一组对象之间存在复杂的交互关系,对象之间的关系变得紧密时,可以使用中介者模式来降低对象之间的耦合度

  • 多个对象需要相互通信,但不希望直接依赖彼此:

    当多个对象需要相互通信,但不希望直接依赖彼此时,可以使用中介者模式,将对象之间的通信委托给中介者

  • 系统中对象之间的交互较为复杂,难以维护:

    当系统中对象之间的交互关系较为复杂,难以维护时,可以使用中介者模式来简化系统结构

3. 代码实现

下面通过一个简单的例子来演示中介者模式的实现。假设有一个聊天室系统,多个用户之间可以进行聊天,我们可以使用中介者模式来管理用户之间的交互。

抽象中介者 - 聊天室 ChatRoomMediator

package com.cheney.demo;

interface ChatRoomMediator {
    
    void sendMessage(UserColleague sender, String message);
}

具体中介者 - 具体聊天室 ConcreteChatRoomMediator

package com.cheney.demo;

class ConcreteChatRoomMediator implements ChatRoomMediator {
    
    @Override
    public void sendMessage(UserColleague sender, String message) {
    
        System.out.println(sender.getName() + " 发送消息: " + message);
    }
}

同事类 - 用户 UserColleague

package com.cheney.demo;

class UserColleague {
    
    private String name;
    private ChatRoomMediator mediator;

    public UserColleague(String name, ChatRoomMediator mediator) {
    
        this.name = name;
        this.mediator = mediator;
    }

    public String getName() {
    
        return name;
    }

    public void sendMessage(String message) {
    
        mediator.sendMessage(this, message);
    }
}

客户端启动类 Main

package com.cheney.demo;

public class Main {
    
    public static void main(String[] args) {
    
        // 使用中介者模式实现聊天室系统
        ChatRoomMediator mediator = new ConcreteChatRoomMediator();

        UserColleague user1 = new UserColleague("用户1", mediator);
        UserColleague user2 = new UserColleague("用户2", mediator);
        UserColleague user3 = new UserColleague("用户3", mediator);

        // 用户1 发送消息: 哈喽!
        user1.sendMessage("哈喽!");
        // 用户2 发送消息:  哈喽!
        user2.sendMessage(" 哈喽!");
        // 用户3 发送消息:  哈喽!
        user3.sendMessage(" 哈喽!");
    }
}

在上述例子中,ChatRoomMediator 是抽象中介者,定义了中介者的接口。ConcreteChatRoomMediator 是具体中介者,实现了抽象中介者的接口,负责管理和协调用户之间的交互。UserColleague 是同事类,每个用户都知道中介者对象,并通过中介者对象进行通信。

在客户端中,我们使用中介者模式实现了聊天室系统。通过将用户之间的通信委托给中介者,实现了用户之间的解耦,使得系统更加灵活和可扩展。

结语

中介者模式是一种用于通过一个中介对象来集中管理多个对象之间的交互关系的设计模式。通过使用中介者模式,可以降低对象之间的耦合度,使得系统更加灵活和可扩展。在实际开发中,中介者模式常被用于实现复杂的系统中对象之间的交互关系,例如聊天室、飞机控制系统等。通过合理使用中介者模式,可以提高系统的可维护性和可扩展性。


【Java 设计模式】系列 《23 种设计模式》 与 《7 大设计原则》 总纲
设计原则
单一职责原则(SRP) 规定一个类应该只有一个引起变化的原因
开放/封闭原则(OCP) 表明软件实体应该是可以扩展的,但是不可修改的
里氏替换原则(LSP) 强调派生类必须能够替代其基类而不引起程序错误
依赖倒置原则(DIP) 倡导高层模块不应该依赖于低层模块,二者都应该依赖于抽象
接口隔离原则(ISP) 提倡一个类不应该被强迫依赖它不使用的接口
合成/聚合复用原则(CARP) 建议尽量使用合成/聚合,尽量不要使用继承
迪米特法则(LoD) 规定一个对象应该对其他对象有最少的了解

创建型设计模式
单例模式 保证一个类仅有一个实例,并提供一个访问它的全局点
工厂方法模式 定义一个用于创建对象的接口,但是由子类决定实例化哪一个类
抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
建造者模式 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
原型模式 通过复制现有的对象来创建新对象,而不是从头开始创建

结构型设计模式
适配器模式 将一个类的接口转换成客户希望的另外一个接口
桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化
组合模式 将对象以树形结构组合以表示“部分-整体”的层次结构
装饰器模式 动态地给一个对象添加一些额外的职责
外观模式 为子系统中的一组接口提供一个一致的界面
代理模式 为其他对象提供一种代理以控制对这个对象的访问
享元模式 用共享的方式高效地支持大量小粒度对象

行为型设计模式
观察者模式 定义对象间的一对多依赖,当一个对象改变状态,所有依赖者都会受到通知并自动更新
策略模式 定义一系列算法,将它们封装起来,并且使它们可以相互替换
命令模式 将请求封装成对象,使得可以用不同的请求对客户进行参数化
状态模式 允许对象在其内部状态改变时改变它的行为
责任链模式 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求
访问者模式 将算法与对象结构分离,并且可以在不改变对象结构的前提下定义新的操作
中介者模式 用一个中介对象来封装一系列的对象交互
备忘录模式 在不破坏封装的情况下,捕获对象的内部状态,并在对象之外保存这个状态
迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示
模版方法模式 定义一个操作中的算法的骨架,将一些步骤延迟到子类中
解释器模式 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yanyc0411/article/details/135779184

智能推荐

240320俄罗斯方块java,JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_2-程序员宅基地

文章浏览阅读202次。packagecode;//importjava.awt.*;//importjava.awt.Canvas;//importjava.awt.event.*;//importjavax.swing.*;importjava.util.Random;importjavax.microedition.lcdui.*;//写界面所需要的包/***//***俄罗斯方块*高雷*2007年1..._240×320java游戏

在线电影院售票平台(源码+开题报告)-程序员宅基地

文章浏览阅读779次,点赞14次,收藏19次。然后,实现系统的数据管理和服务功能,包括用户的注册与登录、电影的分类与展示、电影信息的查询与推荐、座位的选择与预订、在线支付与电子票生成等。此外,随着在线视频平台的兴起,越来越多的人选择在线观看电影,这对传统电影院产生了巨大的冲击。研究意义: 开发在线电影院售票平台对于提升用户的观影体验、优化电影院的运营效率、促进电影产业的发展具有重要的意义。该系统旨在通过技术手段解决传统电影院售票中的问题,提供一个集成化的电影信息展示、座位选择、在线支付和用户评价平台,同时也为电影院和电影制作方提供有效的工具。

程序员熬夜写代码,用C/C++打造一个安全的即时聊天系统!_基于c++的即时聊天系统设计-程序员宅基地

文章浏览阅读509次。保护我们剩下的人的通话信息安全,使用TOX可以让你在和家人,朋友,爱人交流时保护你的隐私不受政府无孔不入的的偷窥.关于TOX:其他牛逼的软件因为一些细化服务问你要钱的时候, TOX分文不取 . 你用了TOX, 想干嘛就干嘛.网友评论:项目源码展示:源码测试效果:最后,如果你学C/C++编程有什么不懂的,可以来问问我哦,或许我能够..._基于c++的即时聊天系统设计

linux Java服务swap分区被占用内存泄露问题故障及解决方法_linux swap占用很高-程序员宅基地

文章浏览阅读584次。鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)当Java服务在Linux系统中运行时,可能会出现swap分区被占用的内存泄露问题,导致系统性能下降或者崩溃。下面是该问题的故障及解决方法、底层结构、架构图、工作原理、使用场景详解和实际应用方式、原理详细描述、相关命令使用示例以及文献材料链接。_linux swap占用很高

word中利用宏替换标点标点全角与半角-程序员宅基地

文章浏览阅读662次。Alt+F11,然后插入-模块:复制下面代码到编辑窗口:Sub 半角标点符号转换为全角标点符号()'中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange..._替换半角宏

Android WebView使用总结_android webview真正加载完成-程序员宅基地

文章浏览阅读2.8k次。#.简介: WebView是Android提供的用来展示展示web页面的View,内部使用webkit浏览器引擎(一个轻量级的浏览器引擎),除了展示Web页面外,还可与Web页面内的JS脚本交互调用。WebView内部的WebSetting对象负责管理WebView的参数配置; WebViewClient负责处理WebView的各种请求和通知事件,在对应事件发生时会执行WebViewClient的对应回调; ChromeWebviewClient辅助Webview处理与JS一些交互......_android webview真正加载完成

随便推点

bitcoin 调试环境搭建-程序员宅基地

文章浏览阅读1.6k次。_bitcoin 调试环境搭建

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)-程序员宅基地

文章浏览阅读4.3k次,点赞93次,收藏94次。为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。本文介绍B样条曲线的基本概念:节点向量、支撑性、次数阶数、加权性质、节点生成算法等,为后续曲线计算打下基础。_样条曲线生成

CDH安装宝典之ClouderaManager_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line -程序员宅基地

文章浏览阅读902次。配置本地repo库下载我的阿里云盘文件文件放置#创建目录mkdir -p /opt/cloudera/parcel-repo/mkdir -p /opt/cloudera/cm/yum install createrepoCDH 6.2.0 的三个文件放到/opt/cloudera/parcel-repo/中,并且注意把sha256后缀的文件名修改为sha#执行createrepo命令生成rpm元数据 最终/opt/cloudera/parcel-repo/会多一个repodata目录_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line 76: /usr/java/jdk1.8.0_181

uni.canvasToTempFilePath在app正常,微信小程序报错: fail canvas is empty-程序员宅基地

文章浏览阅读943次,点赞2次,收藏2次。uni.canvasToTempFilePath_uni.canvastotempfilepath

SDRAM笔记_sdram 干扰-程序员宅基地

文章浏览阅读3.1k次。SRAM :静态RAM,不用刷新,速度可以非常快,像CPU内部的cache,都是静态RAM,缺点是一个内存单元需要的晶体管数量多,因而价格昂贵,容量不大。DRAM:动态RAM,需要刷新,容量大。SDRAM:同步动态RAM,需要刷新,速度较快,容量大。DDR SDRAM:双通道同步动态RAM,需要刷新,速度快,容量大。........................_sdram 干扰

Excel转SQL语句_excel数据怎么生成sql语句-程序员宅基地

文章浏览阅读7.3k次。假设表格有A、B、C、D四列数据,希望导入到你的数据库中表格table,对应的字段分别是col1、col2、col3、col4。_excel数据怎么生成sql语句

推荐文章

热门文章

相关标签