中介者模式

Android一个APP里面最少有几个线程 Android应用启动时,默认会创建一个进程,该进程中最少包含负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应用无响应)。当对象重写了finalize()方法时,该线程负责将这些对象放入队列并调用其finalize()方法,完成资源释放后再由GC回收。监控的执行效率。如果finalize()方法执行超时(默认10秒),此线程会触发虚拟机退出以防止应用长时间阻塞。 阅读详情

智能家庭

 智能家居有许多。当你起床时,你希望各个设备能够协同做一些事情。

 比如:闹钟响起->音响播放音乐->空调关闭

 

传统方案:

在这里插入图片描述

问题:

 当有多种电器时,相互之间的调用关系会比较复杂。不利于松耦合。

 各个对象之间传递的内容容易混乱

 当系统中途增加一个电器对象,或者执行流程改变,则需要改动代码较大,不利于系统的可维护性、扩展性。
 

中介者模式

 用一个中介对象来封装一系列的对象交互。则中介者可以使各个对象不需要显示地相互引用,从而松耦合,又可以独立地改变它们之间的交互。

​
 

中介者模式结构

在这里插入图片描述

 1.组件 (Component) 是含有各种业务逻辑的类。 每个组件都有一个指向中介者的引用, 该引用被声明为中介者接口类型。组件不知中介者实际所属的类, 则可通过连接不同的中介者,提高复用。

 2.中介者 (Mediator)接口声明了与组件交流的方法(通常只有一个通知方法)。组件可将任意上下文(Context)作为通知方法的参数, 使接收组件与发送者不耦合。

 3.具体中介者 (Concrete Mediator) 封装了多种组件间的关系。 具体中介者通常会保存所有组件的引用并对其进行管理, 甚至有时会对其生命周期进行管理。

组件并不知道其他组件的情况。 如果组件内发生了重要事件, 它只能通知中介者。 中介者收到通知后能轻易地确定发送者, 这或许已足以判断接下来需要触发的组件了。对于组件来说, 中介者看上去完全就是一个黑箱。 发送者不知道最终会由谁来处理自己的请求, 接收者也不知道最初是谁发出了请求。

 

中介者模式适合应用场景

 1.当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。

 2.当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。

 3.如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。

 

实现方式

  1. 找到一组当前紧密耦合, 且提供其独立性能带来更大好处的类 (例如更易于维护或更方便复用)。
  2. 声明中介者接口并描述中介者和各种组件之间所需的交流接口。 在绝大多数情况下, 一个接收组件通知的方法就足够了。 如果你希望在不同情景下复用组件类, 那么该接口将非常重要。 只要组件使用通用接口与其中介者合作, 你就能将该组件与不同实现中的中介者进行连接。
  3. 实现具体中介者类。 该类可从自行保存其下所有组件的引用中受益。
  4. 你可以更进一步, 让中介者负责组件对象的创建和销毁。 此后, 中介者可能会与工厂或外观类似。
  5. 组件必须保存对于中介者对象的引用。 该连接通常在组件的构造函数中建立, 该函数会将中介者对象作为参数传递。
  6. 修改组件代码, 使其可调用中介者的通知方法, 而非其他组件的方法。 然后将调用其他组件的代码抽取到中介者类中, 并在中介者接收到该组件通知时执行这些代码。

 

中介者模式优缺点

 优点:

  ✔️ 单一职责原则。 你可以将多个组件间的交流抽取到同一位置, 使其更易于理解和维护。

  ✔️ 开闭原则。 你无需修改实际组件就能增加新的中介者。

  ✔️ 你可以减轻应用中多个组件间的耦合情况。

  ✔️ 你可以更方便地复用各个组件。

 缺点:

  ❌一段时间后, 中介者可能会演化成为上帝对象。

 

解决智能家庭

在这里插入图片描述

代码:

​

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

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

    public Mediator getMediator() {
        return mediator;
    }

    public abstract void sendMessage(int stateChange);
}

public class Clock extends Colleague{

    public Clock(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 colockOpen(){
        System.out.println("闹钟响了");
    }

    public void colockStop(){
        System.out.println("闹钟停了");
    }

    public void sendColock(int stateChange){
        colockOpen();
        sendMessage(stateChange);
    }
}

public class Sound extends Colleague{

    public Sound(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 soundOpen(){
        System.out.println("音响打开");
    }

    public void soundStop(){
        System.out.println("音响关闭");
    }

    public void soundPlaying(){
        System.out.println("音响播放...");
    }

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

}

public class AirCondition extends Colleague{

    public AirCondition(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 airConditionOpen(){
        System.out.println("打开空调");
    }

    public void airConditionStop(){
        System.out.println("关闭空调");
    }

}
public abstract class Mediator {
    //给中介者对象,加入到集合中
    public abstract void register(String colleagueName,Colleague colleague);

    //接收消息,由具体的同时对象发出
    public abstract void getMessage(int stateChange,String colleagueName);

    public abstract void SendMessage();
}

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

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

    @Override
    public void register(String colleagueName, Colleague colleague) {
        colleagueHashMap.put(colleagueName,colleague);

        if (colleague instanceof Clock){
            interMap.put("Clock",colleagueName);
        }else if (colleague instanceof AirCondition){
            interMap.put("AirCondition",colleagueName);
        }else if(colleague instanceof  Sound){
            interMap.put("Sound",colleagueName);
        }
    }

    /*
        核心方法
            1.得到消息后,完成对应任务
            2.中介者在这里协调各个具体的同事对象
     */
    @Override
    public void getMessage(int stateChange, String colleagueName) {
        //处理闹钟的消息
        if (colleagueHashMap.get(colleagueName) instanceof Clock){
            if (stateChange == 0){
                ((Sound)(colleagueHashMap.get(interMap.get("Sound")))).soundOpen();
            }
            if (stateChange == 1){
                ((Sound)(colleagueHashMap.get(interMap.get("Sound")))).soundPlaying();
            }
        }else if (colleagueHashMap.get(colleagueName) instanceof Sound){ //处理音响的信息
            ((AirCondition)colleagueHashMap.get(interMap.get("AirCondition"))).airConditionStop();
        }else if (colleagueHashMap.get(colleagueName) instanceof AirCondition){
            System.out.println("流程完毕...");
        }
    }

    @Override
    public void SendMessage() {

    }
}

public class Client {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();

        Clock clock = new Clock(mediator,"clock");
        Sound sound = new Sound(mediator,"sound");
        AirCondition airCondition = new AirCondition(mediator,"airCondition");


        clock.sendColock(1);
        sound.sendSound(0);

    }
}

 中介者模式的注意事项和细节
  1.多个类相互耦合,会形成网状结构 , 使用中介者模式将网状结构分离为星型结构
进行解耦
  2.减少类间依赖,降低了耦合符合迪米特原则
  3.中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
  4.如果设计不当,中介者对象本身变得过于复杂, 这点在实际使用时,要特别注意

Data-Structures-and-Algorithm-Analysis-in-Java.pdf 作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo... 立即下载

相关推荐

Unity游戏开发客户端Unity基础

Unity游戏开发客户端面经 之 Unity 篇

Sea3752的博客 2万+

设计模式之中介者模式详解

想象一下一个繁忙的机场控制塔,数十架飞机需要起飞、降落、滑行,如果没有这个控制塔作为协调中心,飞机之间直接通信将会多么混乱!中介者模式就像这个机场控制塔,它通过引入一个中介对象来封装一系列对象之间的交互,使这些对象不再显式地相互引用,从而降低它们之间的耦合度。 今天我们就来深入探讨这个在复杂系统中非常实用的设计模式。在实际开发中,当多个类之间存在复杂的网状交互关系时,中介者模式能帮助我们简化系统结构,提高代码的可维护性。

从不水文,坚持创作,加油 2016

LDA主题模型简介及Python实现

一、LDA主题模型简介 LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。 LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-of-word feature)来代表文档。词袋模型介绍可以参考这篇文章:文本向量化表示——词袋模型 - 知乎 了解LDA模型,我们需要先了解LDA的生成模型,LDA认为一篇文章是怎么形成的呢? LDA模型认为主题可以由一个词汇...

weixin_41168304的博客 20万+

JAVA中介者模式

JAVA中介者模式 1、前言 2、中介者模式的概念 3、中介模式的UML图 4、中介模式的实现 5、中介模式的优缺点以及使用的场景 6、总结 1、前言 中秋快乐,哈哈晚了一天说这句话!本来按道理我22号就应该把关于设计模式的博客写完。但是你知道的,我老是给自己放假。于是,中秋佳节,我就和我的小伙伴们打了三天撸。非常开心,感觉自己都活过来了!不过这个月还是要把设计模式的搞完嘞。 ...

帅哥威的博客 1817

从光斑图到锤形优化:一次搞定Zemax双胶合透镜的像散与场曲问题

本文详细解析了Zemax双胶合透镜设计中像散与场曲问题的诊断与优化方法。从光斑图分析到锤形优化技巧,提供了完整的光学设计实战指南,帮助设计师快速定位问题并有效改善系统性能,特别适合光学设计工程师和Zemax使用者参考。

weixin_27134495的博客 233

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

C# 中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它允许一组对象相互通信,而不需要知道彼此的内部结构。通过引入一个中介者对象,将原本对象之间的直接交互转化为与中介者对象的交互,从而降低了对象之间的耦合度,使得系统更加灵活和易于维护。这种模式特别适用于对象之间存在大量复杂交互关系的场景。

語衣的个人博客 1147

OC5021B 100V宽电压输入 LED车灯/大功率照明 DC降压型恒流驱动器

适用于LED大功率汽车大灯/大功率照明 OC5021B 100V宽电压输入 5A电流设计 DC-DC降压型恒流驱动IC

Handsome63841990的博客 2417

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

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

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

SAP 基于生产订单行项目外部加工创建采购申请时的一个增强需求

摘要 本文介绍在SAP系统中实现生产订单外协工序自动生成采购申请(PR)时,将指定文本写入PR抬头文本的技术方案。关键点包括: 业务背景:通过CO02事务码将工序标记为外部加工,系统自动生成PR,需在生成时自动写入抬头文本。 技术难点: PR抬头文本存储在STXH/STXL而非EBAN表 标准增强点ME_PROCESS_REQ_CUST在外协场景可能不触发 推荐方案: 使用BAdI ME_REQ_POSTED,在PR过账时点执行 通过Text Object EBANH和Text ID(如B01)写入文本 实

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 623

VCS NLP 低功耗验证系列(六):功耗分析与优化——SAIF 报告与验证效率提升

本文是VCS NLP低功耗验证系列的第六篇,主要解决功耗数据采集和验证效率优化问题。文章首先介绍了SAIF(Switching Activity Interchange Format)文件在功耗分析中的作用,详细讲解了VCS的Region-Based SAIF功能,包括三个关键系统任务($saif_region_create、$saif_region_exclude、$saif_region_monitor)的使用方法和工程实践建议。接着从编译侧、运行侧和方法学侧三个维度提出了NLP验证效率优化策略,特别强

元直的博客 472

设计模式——中介者模式

在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是 “网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,班长和团支书等干部需要记住同学们的电话,且同学中如果有人的电话修改了,需要告诉所有干部,自己的手机号修改了,这叫作 “牵一发而动全身”,非常复杂。如果把这种 “网状结构” 改为 “星形结构” 的话,将大大降低它们之间的 “耦合性”,这时只要找一个 “中介者” 就可以了。如前面所说的问题,只要在网上建立一个每个干部都可以访问的 “通信录”(中介)就解决了。这样的例子还有很.

程序猿进阶 1796

解决pd.read_json报错ValueError: Trailing data问题

首先,我们使用open函数打开JSON文件,然后使用json.load函数将JSON文件数据解码为Python对象。在使用Python进行数据处理中,我们经常需要将JSON格式的数据读入到DataFrame中进行处理。而使用pandas库的read_json函数,就可以方便地将JSON数据读入到DataFrame中。但是有时候在读取JSON数据时,会遇到一个非常常见的错误:ValueError: Trailing data。这个错误的解决方案并不难,只需要在read_json中添加一个参数即可。

学习使你进步。 2234

设计模式 中介者模式

文章目录中介者模式中介者模式实战不使用中介者模式写法使用中介者模式写法测试验证 中介者模式 中介者模式使用的场景: 把复杂功能的重复调用, 中间添加一层包装, 对外提供简单, 易扩展的服务能力. 例如中间件组提供的统一的接口与服务等. 中介者模式实战 模拟jdbc连接数据库的操作. 使用中介者模式,手写一个简易版的mybatis. 不使用中介者模式写法 创建模块tutorials-19.0-0 创建JDBCUtil类 该类是纯手写jdbc的过程. public class JDBCUtil {

Java持续实践 1102

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C#-设计模式-中介者模式

从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊天的话,可能就需要当面才可以了。电话、短信也同样是一个中间平台,有了这个中间平台,每个用户都不要直接依赖与其他用户,只需要依赖这个中间平台就可以了,一切操作都由中间平台去分发。了解完中介模式在生活中的模型后,下面给出中介模式的正式定义。中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系。

Asincereman的专栏 886

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java设计模式之中介者模式

中介者模式通过引入一个中介者对象,来封装对象之间的交互,防止对象之间的直接通信,从而降低类与类之间的耦合性。中介者模式的核心思想是将系统的行为分散到独立的类中,通过中介者来协调这些行为。中介者模式通过引入一个中介者对象,使得各个同事类之间的通信更加松散耦合,从而提高系统的可维护性和扩展性。虽然中介者模式可以有效地减少对象之间的依赖性,但在实现过程中,可能会导致中介者对象变得过于复杂,因此在使用时需要谨慎考虑。

而世之奇伟、瑰怪,非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也! 1173

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Unity 实现中介者模式

(Mediator Pattern)是一种行为型设计模式,用于减少对象之间的直接依赖关系,通过一个中介对象来协调多个对象的交互。中介者模式的核心思想是将对象之间的通信封装到一个中介者中,从而实现对象之间的松耦合。中介者模式将交互逻辑集中到中介者中,但如果逻辑过于复杂,会导致中介者变成“上帝对象”,难以维护。通过中介者模式,Unity中的系统交互可以变得更加模块化和清晰,同时也为复杂系统的扩展提供了良好的支持。例如,可以结合观察者模式,让中介者管理事件的订阅和通知。具体中介者负责协调同事对象之间的交互。

小宝哥Code的专栏 825
上一篇: 观察者模式
下一篇: 备忘录模式
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值