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

Java设计模式——中介者模式 Java设计模式——中介者模式学习笔记整理(自用) 阅读详情

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

类型:行为类模式

类图:

中介者模式的结构

       中介者模式又称为调停者模式,从类图中看,共分为3部分:

  •  抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。
  • 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。
  • 同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。

为什么要使用中介者模式

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

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

        我们使用一个例子来说明一下什么是同事类:有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,就称为同事类。代码如下:

[java]  view plain copy
  1. abstract class AbstractColleague {  
  2.     protected int number;  
  3.   
  4.     public int getNumber() {  
  5.         return number;  
  6.     }  
  7.   
  8.     public void setNumber(int number){  
  9.         this.number = number;  
  10.     }  
  11.     //抽象方法,修改数字时同时修改关联对象  
  12.     public abstract void setNumber(int number, AbstractColleague coll);  
  13. }  
  14.   
  15. class ColleagueA extends AbstractColleague{  
  16.     public void setNumber(int number, AbstractColleague coll) {  
  17.         this.number = number;  
  18.         coll.setNumber(number*100);  
  19.     }  
  20. }  
  21.   
  22. class ColleagueB extends AbstractColleague{  
  23.       
  24.     public void setNumber(int number, AbstractColleague coll) {  
  25.         this.number = number;  
  26.         coll.setNumber(number/100);  
  27.     }  
  28. }  
  29.   
  30. public class Client {  
  31.     public static void main(String[] args){  
  32.   
  33.         AbstractColleague collA = new ColleagueA();  
  34.         AbstractColleague collB = new ColleagueB();  
  35.           
  36.         System.out.println("==========设置A影响B==========");  
  37.         collA.setNumber(1288, collB);  
  38.         System.out.println("collA的number值:"+collA.getNumber());  
  39.         System.out.println("collB的number值:"+collB.getNumber());  
  40.   
  41.         System.out.println("==========设置B影响A==========");  
  42.         collB.setNumber(87635, collA);  
  43.         System.out.println("collB的number值:"+collB.getNumber());  
  44.         System.out.println("collA的number值:"+collA.getNumber());  
  45.     }  
  46. }  

        上面的代码中,类A类B通过直接的关联发生关系,假如我们要使用中介者模式,类A类B之间则不可以直接关联,他们之间必须要通过一个中介者来达到关联的目的。

[java]  view plain copy
  1. abstract class AbstractColleague {  
  2.     protected int number;  
  3.   
  4.     public int getNumber() {  
  5.         return number;  
  6.     }  
  7.   
  8.     public void setNumber(int number){  
  9.         this.number = number;  
  10.     }  
  11.     //注意这里的参数不再是同事类,而是一个中介者  
  12.     public abstract void setNumber(int number, AbstractMediator am);  
  13. }  
  14.   
  15. class ColleagueA extends AbstractColleague{  
  16.   
  17.     public void setNumber(int number, AbstractMediator am) {  
  18.         this.number = number;  
  19.         am.AaffectB();  
  20.     }  
  21. }  
  22.   
  23. class ColleagueB extends AbstractColleague{  
  24.   
  25.     @Override  
  26.     public void setNumber(int number, AbstractMediator am) {  
  27.         this.number = number;  
  28.         am.BaffectA();  
  29.     }  
  30. }  
  31.   
  32. abstract class AbstractMediator {  
  33.     protected AbstractColleague A;  
  34.     protected AbstractColleague B;  
  35.       
  36.     public AbstractMediator(AbstractColleague a, AbstractColleague b) {  
  37.         A = a;  
  38.         B = b;  
  39.     }  
  40.   
  41.     public abstract void AaffectB();  
  42.       
  43.     public abstract void BaffectA();  
  44.   
  45. }  
  46. class Mediator extends AbstractMediator {  
  47.   
  48.     public Mediator(AbstractColleague a, AbstractColleague b) {  
  49.         super(a, b);  
  50.     }  
  51.   
  52.     //处理A对B的影响  
  53.     public void AaffectB() {  
  54.         int number = A.getNumber();  
  55.         B.setNumber(number*100);  
  56.     }  
  57.   
  58.     //处理B对A的影响  
  59.     public void BaffectA() {  
  60.         int number = B.getNumber();  
  61.         A.setNumber(number/100);  
  62.     }  
  63. }  
  64.   
  65. public class Client {  
  66.     public static void main(String[] args){  
  67.         AbstractColleague collA = new ColleagueA();  
  68.         AbstractColleague collB = new ColleagueB();  
  69.           
  70.         AbstractMediator am = new Mediator(collA, collB);  
  71.           
  72.         System.out.println("==========通过设置A影响B==========");  
  73.         collA.setNumber(1000, am);  
  74.         System.out.println("collA的number值为:"+collA.getNumber());  
  75.         System.out.println("collB的number值为A的10倍:"+collB.getNumber());  
  76.   
  77.         System.out.println("==========通过设置B影响A==========");  
  78.         collB.setNumber(1000, am);  
  79.         System.out.println("collB的number值为:"+collB.getNumber());  
  80.         System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());  
  81.           
  82.     }  
  83. }  

        虽然代码比较长,但是还是比较容易理解的,其实就是把原来处理对象关系的代码重新封装到一个中介类中,通过这个中介类来处理对象间的关系。

中介者模式的优点

  • 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
  • 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。
  • 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。

适用场景

       在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。可以将网状结构变为星状结构,使同事类之间的关系变的清晰一些。

       中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂

Java设计模式原则及中介者模式研究 在该系统中,为了实现对不同生理参数的监测和数据分析,设计者采用了模块化的设计方法,并通过定义抽象的接口来实现各个模块之间的交互。同时,随着技术的不断进步和创新,我们也可以期待更多新的设计模式和编程思想的出现,为软件开发领域注入新的活力和动力。这些原则为开发者提供了在设计类、接口以及它们之间的交互时应遵循的准则,有助于减少代码的耦合性,增加系统的可扩展性和可维护性。里氏替换原则指出,在程序中,如果S是T的子类型,那么程序中使用类型T的对象的地方都可以用类型S的对象来替换,而程序的行为不会发生变化。 阅读详情

相关推荐

23种设计模式-中介者(Mediator)设计模式

软考中级-软件设计师 中介者设计模式

片言可决讼,半纸能缚龙 1865

设计模式之【中介者模式】,多对多关系降级为一对多关系的利器

中介者模式(Mediator Pattern)又称为调节者模式或调停者模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式的相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互,属于行为型模式。中介者模式的核心思想是,通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发。

秃了也弱了 4410

【Java设计模式】Java设计模式之(十)中介者模式(Mediator Pattern)

所有设计模式的代码实现例子都可在码云上查看哦,感兴趣的可以查看哈,码云地址:https://gitee.com/no8g/java-design-patterns

No8g攻城狮的博客 940

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

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

glass__sky的博客 6717

Win10离线安装.net framework 3.5全攻略:镜像匹配与DISM命令实战(附错误0x8024402c解决方案)

本文详细解析了在Windows 10系统中离线安装.NET Framework 3.5的完整流程与核心难点。重点阐述了如何精准匹配系统版本与安装镜像,并提供了使用DISM命令进行离线安装的实战步骤。针对常见的错误代码0x8024402c,文章深入剖析了其根源,并给出了系统级的排查与解决方案,特别适合企业内网运维人员参考。

weixin_29299807的博客 662

爬虫-Playwright逆向小红书

【代码】爬虫-Playwright逆向小红书。

weixin_44201223的博客 2432

设计模式第18讲——中介者模式(Mediator)

中介者模式是一种行为型设计模式,它主要用于减少对象之间互相通信的复杂性。一、什么是中介者模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景五、代码实现 5.0 UML类图 5.1抽象中介者(Mediator)——LogisticsCenter5.2抽象同事类(Colleague)——Participant5.3具体同事类(Concrete Colleague)TransportCompany&Merchant5.4具体中介者(Con

让~学习~成为一种习惯(橡 皮 人の技术博客) 3292

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据 日常工作,我们经常需要汇总相同格式的工作簿的某个工作表的数据 如1月业绩、2月业绩。。。。12月业绩等 姓名 数量 数据22 22 数据23 23 数据24 24 数据25 25 数据26 26 数据27 27 数据28 28 数据29 29 数据30 30 数据31 31 数据32 32 数据33 33 数据34

陈表达的博客 5983

Java设计模式之行为型:中介者模式

中介者模式通过中介者对象来封装一系列的对象交互,将对象间复杂的关系网状结构变成结构简单的以中介者为核心的星形结构,对象间一对多的关联转变为一对一的关联,简化对象间的关系,便于理解;各个对象之间的关系被解耦,每个对象不再和它关联的对象直接发生相互作用,而是通过中介者对象来与关联的对象进行通讯,使得对象可以相对独立地使用,提高了对象的可复用和系统的可扩展性。在中介者模式中,中介者类处于核心地位,它封装了系统中所有对象类之间的关系,除了简化对象间的关系,还可以对对象间的交互进行进一步的控制。

张维鹏的博客 1万+

FSMC驱动LCD显示屏学习2

液晶显示器,简称 LCD(Liquid Crystal Display)相对于上一代 CRT 显示器 (阴极射线管显示器),LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备液晶是一种介于固体和液体之间的特殊物质,它是一种有机化合物,常态下呈液态,但是它的分 子排列却和固体晶体一样非常规则,因此取名液晶。

usjjjsj的博客 1696

HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信

本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。

weixin_42632434的博客 416

JAVA设计模式之 中介者模式【Mediator Pattern】

一、概述     用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。 二、适用场景     协调多个对象之间的交互。 三、UML类图 四、参与者 1、Mediator(抽象中介者):它定义一个接口,该接口用于与各同

小吕丶Code阶区 5061

TypeScript领域建模实战:基于斯坦福本体论七步法构建健壮数据模型

在软件工程中,领域建模是连接业务需求与技术实现的关键桥梁,其核心在于对业务概念、属性及其关系的显式定义与规范。通过系统化的建模方法,开发者能够将模糊的领域知识转化为清晰、可扩展且类型安全的数据结构,从而在编译时捕获潜在错误,提升代码质量与可维护性。这一过程的技术价值在于实现了从业务逻辑到类型系统的无损映射,确保了设计的一致性。在实践中,结合TypeScript的静态类型检查与Zod的运行时验证,可以构建起从概念到代码再到数据库的三层一致性约束。本文以电商、博客等常见应用场景为例,深入解析如何运用源自斯坦福知

weixin_42551967的博客 383

Java设计模式之中介者模式(Mediator Pattern)

中介者模式定义了一个中介对象来封装一系列对象之间的交互。这种模式使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在中介者模式中,中介者负责处理对象间的通信和协作,对象间不再直接交互,而是通过中介者来间接通信。

shiming8879的博客 964

基于BEV(鸟瞰图)的3D检测:PointPillars与CenterPoint

基于BEV(鸟瞰图)的3D检测:PointPillars与CenterPoint​ ,人工智能,计算机视觉,大模型,AI,本文围绕基于BEV的3D检测,解析了PointPillars与CenterPoint两种算法。PointPillars用点柱特征编码网络处理点云,通过2D卷积网络提取特征,检测头为解耦头;CenterPoint将三维物体表为点,分两阶段检测,先找中心点及属性,再细化预测。两者都可借特定骨干网生成BEV特征图且基于BEV检测,但检测头设计和物体表示方式不同。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 27万+

ENVI入门系列教程---一、数据预处理---1.1基本操作--5.x以后的界面(新界面)

every blog every motto: You never know how strong you really are until being strong is the only choice you have。 0. 前言 本系列教程旨在系统学习并梳理ENVI。说来惭愧,作为一名GISer,对ENVI这类软件还不能熟练掌握,这也是本系列教程的初衷。种一棵树最好的时间是十年以前,其次是...

胡侃有料的博客 1万+

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 中介者模式(Mediator) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 中介者模式(Mediator) 中介者封装一系列对象操作,使对象之间不需要显式操作,从而实现耦合松散。

Z 507

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【设计模式】用Java实现中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的通信集中处理,从而降低对象之间的耦合度。中介者模式的核心是中介者(Mediator)角色,它定义了对象之间的通信接口,负责协调和控制对象之间的交互。具体的对象称为同事(Colleague)角色,每个同事角色都与中介者进行通信,而不直接与其他同事进行交互。当系统中的对象之间存在复杂的相互关系和依赖关系,导致对象之间的通信和协作变得混乱难以维护时,可以考虑使用中介者模式。

分享Java硬核干货 9130

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【设计模式】Java设计模式 - 中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

qq_43843951的博客 484

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java设计模式——中介者模式【Mediator Pattern】

Java设计模式、中介者模式、Mediator Pattern

scorpio的博客 393

Java设计模式 二十一 中介者模式 (Mediator Pattern)

中介者模式通过引入中介者对象,减少了系统中各个同事类之间的直接依赖,简化了类与类之间的交互。它使得系统更加灵活,可维护性更高。虽然中介者模式提高了系统的可扩展性,但也可能导致中介者本身变得复杂,因此需要合理使用,尤其是在交互较为复杂的系统中。

空 774

Java设计模式之中介者模式

首先,需要定义一个中介者接口,该接口包含所有同事类需要调用的方法。然后,创建具体的中介者类来实现这个接口,并在其中维护一个指向所有同事类实例的引用。

破损的天堂鸟博客 1338

Java 设计模式之中介者模式

本文介绍了 Java 中的设计模式之中介者模式。首先,我们讲解了中介者模式的基本原理,即通过将对象之间的通信封装在中介者对象中,降低对象之间的耦合度,提高代码的可维护性和可扩展性。接着,我们使用一个简单的 GUI 应用程序案例来演示中介者模式的具体实现过程,包括中介者接口、具体中介者类、抽象同事类、具体同事类等。最后,我们总结了中介者模式的优缺点,以及在什么情况下应该使用中介者模式。通过本文的介绍,读者可以更好地理解中介者模式的原理和应用场景,以便在实际开发中灵活运用该设计模式。

来自上海的这位朋友 529

Java设计模式 —— 【行为型模式】中介者模式(Mediator Pattern)详解

中介者模式是迪米特原则的经典体现:它要求一个对象应该对其他对象保持最少的了解。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

知唔猪的博客 1269

《JAVA设计模式系列》中介者模式

中介者模式用一个中介对象来封装一系列对象的交互,从而把一批原来可能是交互关系复杂的对象转换成一组松散耦合的中间对象,以有利于维护和修改。当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及很多其他对象的行为,可使用中介者模式。: 定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。: 是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。降低复杂度:将多对多依赖转化成了一对多,降低了类间耦合。

追寻心的步伐 523

Java设计模式-中介者模式

摘要:中介者模式是一种行为型设计模式,通过引入中介对象来解耦对象间的直接交互。核心思想是将对象间的通信集中到中介者中处理,从而降低系统耦合度。该模式包含四个角色:抽象中介者、具体中介者、抽象同事类和具体同事类。典型应用场景包括GUI组件交互、聊天系统等。相比传统强耦合的实现方式(如用户间直接引用),中介者模式通过让对象仅与中介者交互,显著提高了系统的灵活性和可维护性。案例展示了聊天系统中如何使用中介者模式替代直接用户交互,解决对象间高耦合问题。

weixin_66095070的博客 796
上一篇: Java设计模式---模板模式
下一篇: java设计模式----观察者模式
cding1818
博客等级 码龄17年 963粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值