设计模式学习——中介者模式

中介者模式--实例分析 模式的定义与特点 中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。 中介者模式是一种对象行为型模式,其主要优点如下: 类之间各司其职,符合迪米特法则。 降低了对象之间的耦合性,使得对象易于独立地被复用。 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。 其主要缺点是: 中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事 阅读详情



基本介绍

  1. 中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  2. 中介者模式属于行为型模式,使代码易于维护
  3. 比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。

原理类图

在这里插入图片描述
对原理类图的说明-即(中介者模式的角色及职责)

  1. Mediator 就是抽象中介者,定义了同事对象到中介者对象的接口
  2. Colleague 是抽象同事类
  3. ConcreteMediator 具体的中介者对象,实现抽象方法,他需要所有的具体的同事类,即以一个集合来管理HashMap,并接受某个同事对象的消息,完成相应的任务
  4. ConcreteCollegue 具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但是他们都依赖中介者对象。

中介者模式的类图实例

在这里插入图片描述
中介者模式:智能家庭的操作流程

  1. 创建ConcreMediator 对象
  2. 创建各个同事类对象,比如:Alarm、CoffeeMachine、Curtains、TV
  3. 在创建同事类对象的同时,就直接通过构造器,加入到colleagueMap
  4. 同事类对象,可以调用sendMessage,最终会调用ConcreteMediator的getMessage方法
  5. getMessage 会根据接收到的同事对象发出的消息来协调调用完成任务。
  6. 可以看到getMessage是核心方法,完成相关任务

中介者模式的代码实例

中介者抽象类

public abstract class Mediator {
    //将一个中介者对象,加入到集合中。
    public abstract void register(String colleagureName, Colleague colleague);
    //接收消息,具体的同事对象发出的消息
    public abstract void getMessage(int stateChange, String colleagueName);
    //发送消息
    public abstract void sendMessage();
}

具体的中介者实现类,实现具体的操作

//具体的中介者类
public class ConcreteMediator extends Mediator {
    //集合,放入所有的同事对象
    private HashMap<String, Colleague> colleagueMap;
    private HashMap<String, String> interMap;

    public ConcreteMediator() {
        colleagueMap = new HashMap<>();
        interMap = new HashMap<>();
    }

    @Override
    public void register(String colleagureName, Colleague colleague) {
        colleagueMap.put(colleagureName, colleague);
        if (colleague instanceof Alarm) {
            interMap.put("Alarm", colleagureName);
        } else if (colleague instanceof CoffeeMachine) {
            interMap.put("CoffeeMachine", colleagureName);
        } else if (colleague instanceof TV) {
            interMap.put("TV", colleagureName);
        } else if (colleague instanceof Curtains) {
            interMap.put("Curtains", colleagureName);
        }
    }

    //具体中介者的核心方法
    //1. 根据得到的消息完成对应的任务。
    //2. 中介者在这个方法,协调各个具体的同事对象,完成任务
    @Override
    public void getMessage(int stateChange, String colleagueName) {
        if (colleagueMap.get(colleagueName) instanceof Alarm) {
            if (stateChange == 0) {
                ((CoffeeMachine) (colleagueMap.get(interMap.get("CoffeeMachine")))).startCoffee();
                ((TV) (colleagueMap.get(interMap.get("TV")))).startTv();
            } else if (stateChange == 1) {
                ((TV) (colleagueMap.get(interMap.get("TV")))).stopTv();
            }
        } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {
            ((Curtains) (colleagueMap.get(interMap.get("Curtains")))).upCurtains();
        } else if (colleagueMap.get(colleagueName) instanceof TV) {
            ((TV) (colleagueMap.get(interMap.get("TV")))).startTv();
        } else if (colleagueMap.get(colleagueName) instanceof Curtains) {
            ((Curtains) (colleagueMap.get(interMap.get(colleagueName)))).upCurtains();
        }
    }

    @Override
    public void sendMessage() {

    }
}

同事抽象类,各个同事类通过继承并重写方法来完成与同事抽象类的消息传递

//同事抽象类
public abstract class Colleague {
    private Mediator mediator;
    public String name;

    public Colleague(Mediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public Mediator getMediator() {
        return this.mediator;
    }

    public abstract void sendMessage(int stateChange);
}

通过mediator.register注册同事子类,通过发送消息与同事类进行消息传递

//具体的同事类
public class Alarm extends Colleague {

    //构造器
    public Alarm(Mediator mediator, String name) {
        super(mediator, name);
        //在创建Alarm同事对象时,将自己放入到ConcreteMediator 对象中[集合]
        mediator.register(name, this);
    }

    public void sendAlarm(int stateChange) {
        sendMessage(stateChange);
    }

    @Override
    public void sendMessage(int stateChange) {
        //调用中介者对象的getMessage
        this.getMediator().getMessage(stateChange, this.name);
    }
}
public class CoffeeMachine extends Colleague {
    public CoffeeMachine(Mediator mediator, String name) {
        super(mediator, name);
        mediator.register(name, this);
    }

    public void startCoffee() {
        System.out.println("CoffeeMachine is making Coffee");
    }

    public void finishedCoffee() {
        System.out.println("CoffeeMachine maked Coffee");
        System.out.println("Coffee is ok!");
        sendMessage(0);
    }

    @Override
    public void sendMessage(int stateChange) {
        this.getMediator().getMessage(stateChange, this.name);
    }

}
public class Curtains extends Colleague {

    public Curtains(Mediator mediator, String name) {
        super(mediator, name);
        mediator.register(name, this);
    }

    @Override
    public void sendMessage(int stateChange) {
        this.getMediator().getMessage(stateChange, this.name);
    }

    public void upCurtains(){
        System.out.println("I am holding Up Curtains");
    }
}
public class TV extends Colleague {

    public TV(Mediator mediator, String name) {
        super(mediator, name);
        mediator.register(name, this);
    }

    @Override
    public void sendMessage(int stateChange) {
        this.getMediator().getMessage(stateChange, this.name);
    }

    public void startTv(){
        System.out.println("It's time to startTV");
    }

    public void stopTv(){
        System.out.println("It's time to stopTv");
    }
}

客户端

public class Client {

    public static void main(String[] args) {
        //创建一个中介者对象
        Mediator mediator=new ConcreteMediator();
        //创建Alarm并且加入到ConcreteMediator 对象的HashMap
        Alarm alarm=new Alarm(mediator,"alarm");

        //创建了CoffeeMachine 对象,并且加入到ConcreteMediator对象的HashMap
        CoffeeMachine coffeeMachine=new CoffeeMachine(mediator,"coffeeMachine");
        //创建Curtains,并且加入到ConcreteMediator 对象的HashMap
        Curtains curtains=new Curtains(mediator,"curtains");
        TV tv=new TV(mediator,"TV");
        alarm.sendAlarm(0);
        coffeeMachine.finishedCoffee();
        alarm.sendAlarm(1);
    }
}

中介者模式的注意事项和细节

  1. 多个类相互耦合,会形成网状结构,使用中介者模式会将网状结构分离为星型结构,进行解耦。
  2. 减少类间依赖,降低了耦合,符合迪米特法则
  3. 中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
  4. 如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意。
基于FreeSwitch与SIP UA的蓝牙电话坐席系统实战部署 本文详细介绍了如何基于FreeSwitch开源软交换平台,结合SIP UA软电话与蓝牙电话App,在局域网内搭建一套低成本、自主可控的电话坐席系统。文章提供了从环境准备、FreeSwitch安装配置、用户与拨号计划创建,到SIP软电话测试和蓝牙设备接入的完整实战部署流程,并给出了关键优化与排坑指南,适合小微团队或个人开发者构建内部通讯工具。 阅读详情

相关推荐

别再只看K线了!聊聊“板块联动”和“热点轮动”的跟踪方法与工具(实战派分享)

本文深入解析了如何通过板块联动和热点轮动构建高效交易系统。从三维验证框架到主流工具配置,再到持续性热点的五大特征,实战派交易员分享了识别市场主线和预判轮动方向的高阶技巧,帮助投资者摆脱单纯依赖K线的局限,提升交易决策效率。

weixin_29281941的博客 760

设计模式(18)——中介者模式

目录智能家庭项目传统方案解决智能家庭管理问题中介者模式中介者模式应用实例-智能家庭管理中介者模式的注意事项和细节 智能家庭项目 智能家庭项目 智能家庭包括各种设备、闹钟、咖啡机、电视机、窗帘 等 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起 -> 咖啡机开始做咖啡 -> 窗帘自动落下 -> 电视机开始播放 传统方案解决智能家庭管理...

minge0001的博客 605

初识机会网络仿真器ONE中ExternalMovement移动模型(导入外部移动数据)

最近半个月一直在研究ONE中关于ExternalMovement移动模型的源代码,在网上几乎没有找到相关的资料,很是苦恼,如果有共同研究方向的小伙伴欢迎联系我,共同讨论进步。 下面记录一下几点感悟: 1、使用外部数据的前提是在ONE的配置文件中增加及修改相关代码: Group.movementModel = ExternalMovement ExternalMovement.file = move...

qq_36974792的博客 658

JAVA 异常学习

目录 一.try-catch 1.有了异常,加try-catch和不加try-catch的区别 2.try-catch-finally 2.try-catch-catch-finally 3.如何让finally不输出 4.在语句中加入return 二.Throws和Throw 1.区别 2.例子 三.自定义异常 1.步骤 2.例子1 3.例子2 四.一些面试题 1.列出至少五种以上常见异常 2.列出异常的五个关键字 3.throws和throw的区别 4.fin...

qq_45267354的博客 720

C++实现SM4国密算法实战指南

通过以上实现,开发者可以快速在C++项目中集成SM4国密算法,满足金融、政务等领域的安全需求。实际部署时建议通过国家密码管理局的合规性检测,并定期更新密钥管理策略。库(支持国密算法),需提前安装并配置开发环境。

skyksksksksks的博客 1487

Windows下快速搭建MSYS2开发环境(含GCC与MinGW配置)

本文详细介绍了在Windows系统下快速搭建MSYS2开发环境的完整流程。通过使用pacman包管理器,可以便捷地安装GCC编译器与MinGW-w64工具链,并配置系统环境变量。文章还涵盖了从基础安装、系统更新到编译开源项目的实战指南,帮助开发者高效构建原生Windows程序,显著提升C/C++开发效率。

weixin_29213827的博客 539

Java设计模式之行为型-中介者模式(UML类图+案例分析)

中介者模式的核心思想是引入一个中介者对象,来封装和管理对象之间的交互关系。对象之间不再直接交互,而是通过中介者间接交互。这样可以减少对象之间的依赖,实现解耦。中介者就像是对象之间的调停者,协助对象間的交流与相互操作。总体上,中介者模式可以使原本相互耦合的对象变成松散耦合,提高了灵活性和可维护性。中介者对象承担了对象間交互的责任,每个对象只需关注自身的行为和逻辑,不再与其他对象直接交互。

黄团团的个人博客 1670

基于深度学习的涂胶缺陷类型检测:数据集处理与YOLOv8模型实现

本文提出了一种基于YOLOv8深度学习的涂胶缺陷检测系统,针对断胶、溢胶、缺胶、气泡及胶条宽度异常等常见缺陷类型,实现了从数据采集到模型部署的完整解决方案。系统采用工业相机采集涂胶图像,通过多形态数据增强策略解决样本稀缺问题,利用YOLOv8框架实现高效检测。相比传统人工目检和规则式机器视觉方法,该系统在检测精度(mAP达97.5%)和实时性(单图检测耗时0.038秒)方面表现优异,可满足智能制造场景下的涂胶质量检测需求。

huanghm88的专栏 271

Java设计模式之中介者模式

Java设计模式之中介者模式1. 中介者模式概述2. 中介者模式实现 1. 中介者模式概述 2. 中介者模式实现

靖节先生的博客 415

Android 14.0 系统开机屏幕设置默认横屏显示

在14.0的系统ROM产品定制化开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了

安卓兼职framework和app工程师的博客 2151

xtop:multi_driven_net与incomplete_timing_cell fail reason 分析

man multi_driven_net”可以得知,这个问题是multi driven结构引起的,使用命令“get_failed_pins -reason multi_driven_net”,获取violation pin。“man incomplete_timing_cell”可以得知,这个fail reason的原因是缺少timing library cell,检查并补全后这个错误就显示了。这里选择的解决方法是修改lib文件,把inout改成input,重新lib2idb。通过这种方法解决了问题。

m0_61544122的博客 567

设计模式学习—中介者模式(Mediator Design Pattern)

设计模式之中介者模式,一种行为型模式

闲鱼的博客 376

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

认真学习设计模式之中介者模式(Mediator Pattern)

# 【1】概述 中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 中介者模式属于`行为型`模式,使代码易于维护。比如MVC 模式,C(Controller 控制器)是M(Model 模型)和V(View 视图)的中介者,在前后端交互时起到了中间人的作用。 **UML 类图** ![在这里插入图片描述](https://img-blog.csdnimg.cn/e4e6787e1

小小默:进无止境 1365

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

设计模式学习--19.中介者模式(Mediator Pattern)

package com.designepattern.mediatorpattern.v2; import java.util.ArrayList; import java.util.List; /** * @Author:glx * @Date:2020/12/10 * @Content: */ public class MainDemo { public static void main(String[] args) { Person p1=new Pe...

u010031813的博客 189

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

学习设计模式《九》——中介者模式

 中介者模式的本质是【封装对象之间的交互】;

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1387

尚硅谷设计模式学习(19)---[中介者模式(Mediator Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! 案例智能家庭项目: 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘等 例如看电视之前,各个设备可以协同工作,自动完成看电视的准备工作,完成一系列流程工作. 这样的案例类似于之前的外观模式(电影院案例); 先看另一个案例; 比如说;某人要去租房,但是房主A要和房主B去商量,房主B要和房主C商量; 现在让中介者来解决问题;中介直接和三个房主分别沟通;减少了子系统之间的

从零开始的异世界JAVA学习 318

学习笔记【23种设计模式-第十八节:Mediator Pattern 中介者模式】

Mediator Pattern 中介者模式 简述: 中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 中介者模式属于行为型模式,使代码易于维护 比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。 角色 Mediator就是抽象中介者,它定义了同事对象到中介者对象的接口 Colleague 是抽象同事类 ConcreteMedi

qq_53273362的博客 157

Java设计模式学习-中介者模式Mediator

核心: 如果一个系统中对象之间的联系呈现为网状结构 , 对象之间存在大量多对多关系 , 将导致关系及其复杂 , 这些对象称为 --同事对象 。 我们可以引入一个中介者对象 , 使各个同事对象只跟中介者对象打交道 , 将复杂的网状结构化解为简单的星状结构如下                       中介者类图如下   接下来用代码实现中介者模式 1),创建部门类接口  并创建...

NULL 312

设计模式学习笔记--中介者模式

一.简介 今天来学习一下传说中的中介者模式。说到中介者,我们最容易想到的就是电话中继器,这里我们看看电话的演变过程吧。最早的电话只是两个通话的用户之间相连,这样的结构简单直接,操作最方便。但是随着使用电话的人数多了起来,为每两部电话之间架设一条线路很明显是不可能的,于是就有了电话中继器,记得以前经常看老电影里面,打电话的人要拿起电话,先打给接线员,说“给我接到XXX那”。没错,接线员就相当于中介

puppet_master的专栏 1525

java设计模式学习之【中介者模式】

这篇教程不仅提供了中介者模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1289

《Java设计模式学习》中介者模式

中介者模式是一种行为型模式,它定义了一个中介者对象,该对象封装了一组对象之间的交互,并促进了这些对象之间的松耦合关系。中介者模式的目的是减少对象之间的直接依赖关系,从而提高系统的可维护性和可扩展性。中介者模式的核心思想是封装对象之间的交互,并将这些交互转移到中介者对象中。这样做的好处是,当一个对象发生变化时,只有中介者对象需要进行修改,而不需要修改所有与该对象交互的其他对象。中介者模式是一种非常有用的设计模式,它可以帮助我们解决对象之间的紧耦合关系和复杂交互问题。

一个不断前行的程序者 367

设计模式学习—21中介者模式

中介者模式 文章目录中介者模式UML解释说明代码实现参考资料 UML 解释说明 中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合降低,并且可以独立地改变他们之间的交互。 注意:中介者会使交互的复杂性转变成中介者的复杂性。 中介者模式一般应用于一组对象以良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,但是又不想生成太多的子...

Abfahrt的博客 172

学习设计模式之中介者模式

中介者模式 用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 类结构图 Mediator 抽象中介者,定义了同事对象到中介者对象的接口。 ConcreteMediator 具体的中介者对象,实现抽象类的方法,它需要知道所有的 “组织” 类。并从具体的 “组织” 类接收消息,向具体的 ““组织”” 对象对象发出命令。 ...

qq_16830879的博客 167

设计模式学习之中介者模式

我们平时写代码的过程,一个类必然会与其他类产生依赖关系,如果这种依赖关系如网状般错综复杂,那么必然会影响我们的代码逻辑以及执行效率,适当地使用中介者模式可以对这种依赖关系进行解耦使逻辑结构清晰,本篇博客,我们就一起学习中介者模式。定义及使用场景定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对

一个码农的博客 8108

23种设计模式学习记录之中介者模式

想说的话: 在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vue。毕业两年后去面试,发现设计模式还是java程序员需要迈过的一道坎,面试的时候问到代理模式和适配器模式有什么区别,你在工作中用到了什么设计模式,怎么用的?答不上来的特别尴尬,所以决定重新学习这几种设计模式,争取在工作中使用上。 本文所有案例代码 码云:https://gitee.com/helloworld6

lx9876lx的博客 173

中介者模式 - 设计模式学习

中介者模式 - 设计模式学习   中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。   来看中介者模式的结构图:        Colleag...

132
上一篇: 设计模式学习——观察者模式
下一篇: 设计模式学习——备忘录模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值