设计模式-中介者模式在Java中使用示例-客户信息管理

场景

欲开发客户信息管理窗口界面,界面组件之间存在较为复杂的交互关系:如果删除一个客户,

要在客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中客户名称也将减少一个;

如果增加一个客户信息,客户列表中需增加一个客户,且组合框中也将增加一项。

中介者模式概述

如果在一个系统中对象之间的联系呈现为网状结构。对象之间存在大量的多对多联系,将导致系统非常复杂,

这些对象既会影响别的对象,也会被别的对象所影响,这些对象称为同事对象,它们之间通过彼此的相互作用

实现系统的行为。在网状结构中,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个

对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统。

中介者模式可以使对象之间的关系数量急剧减少,通过引入中介者对象,可以将系统的网状结构变成以中介者

为中心的星形结构。在这个星形结构中,同事对象不再直接与另一个对象联系,它通过中介者对象与

另一个对象发生相互作用。中介者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为

新对象的引入带来大量的修改工作。

中介者模式结构图

 

在中介者模式结构图中包含如下几个角色:

Mediator(抽象中介者):

它定义一个接口,该接口用于与各同事对象之间进行通信。

ConcreteMediator(具体中介者):

它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。

Colleague(抽象同事类):

它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类

的引用,其子类可以通过该引用来与中介者通信。

ConcreteColleague(具体同事类):

它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,

通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。

注:

博客:
霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客

实现

使用中介者模式实现客户信息管理页面。

1、新建抽象中介者

//抽象中介者
abstract class Mediator {public abstract void componentChanged(Component component);
}

2、然后新建具体中介者,维持对各个同事对象的引用

//具体中介者
public class ConcreteMediator extends Mediator{//维持对各个同事对象的引用public Button addButton;public UserList userList;public TextBox userNameTextBox;public ComboBox cb;@Overridepublic void componentChanged(Component c) {//单击按钮if(c == addButton){System.out.println("单击增加按钮");userList.update();cb.update();userNameTextBox.update();}else if(c == userList){System.out.println("从列表框选择客户");cb.select();userNameTextBox.setText();}else if(c == cb){System.out.println("从组合框选择客户");cb.select();userNameTextBox.setText();}}
}

3、新建抽象组件类:抽象同事类

//抽象组件类:抽象同事类
abstract class Component {protected Mediator mediator;public void setMediator(Mediator mediator){this.mediator = mediator;}//转发调用public void changed(){mediator.componentChanged(this);}public abstract void update();
}

4、新建具体同事类:按钮类

//按钮类:具体同事类
public class Button extends Component{public void update() {System.out.println("列表增加一项");}public void select(){System.out.println("列表框选中项");}
}

5、新建具体同事类:组合框类

//组合框类:具体同事类
public class ComboBox extends Component{public void update() {System.out.println("组合框增加一项");}public void select(){System.out.println("组合框选中项");}
}

6、新建具体同事类:文本框类

//文本框类:具体同事类
public class TextBox extends Component{public void update() {System.out.println("客户信息增加成功后文本框清空");}public void setText(){System.out.println("文本框显示");}
}

7、新建具体同事类:列表框类

//列表框类:具体同事类
public class UserList extends Component{public void update() {System.out.println("列表框增加一项");}public void select(){System.out.println("列表框选中项");}
}

8、客户端调用方式如下

public class Client {public static void main(String[] args) {//定义中介者对象ConcreteMediator mediator;mediator = new ConcreteMediator();//定义同事对象Button addBT = new Button();UserList userList = new UserList();ComboBox cb = new ComboBox();TextBox userNameTB = new TextBox();addBT.setMediator(mediator);userList.setMediator(mediator);cb.setMediator(mediator);userNameTB.setMediator(mediator);mediator.addButton = addBT;mediator.userList = userList;mediator.cb = cb;mediator.userNameTextBox = userNameTB;addBT.changed();userList.changed();}
}

9、总结

中介者模式将一个网状的系统结构变成一个以中介者对象为中心的星形结构,在这个星型结构中,

使用中介者对象与其他对象的一对多关系来取代原有对象之间的多对多关系。

中介者模式在事件驱动类软件中应用较为广泛,特别是基于GUI(Graphical User Interface,图形用户界面)

的应用软件,此外,在类与类之间存在错综复杂的关联关系的系统中,中介者模式都能得到较好的应用。

中介者模式的主要优点如下:

(1) 中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,

一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星型结构。

(2) 中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合,我们可以独立的改变和复用

每一个同事和中介者,增加新的中介者和新的同事类都比较方便,更好地符合“开闭原则”。

(3) 可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的

中介者子类即可,这使各个同事类可被重用,无须对同事类进行扩展。

中介者模式的主要缺点如下:

在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

在以下情况下可以考虑使用中介者模式:

(1) 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。

(2) 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。

(3) 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来

实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体中介者类。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go web框架 gin-gonic源码解读01————Engine

go web框架 gin-gonic源码解读01————Engine gin-gonic是go语言开发的轻量级web框架,性能优异,代码简洁,功能强大。有很多值得学习的地方,最近准备把这段时间学习gin的知识点,通过engine,context,router…

git操作:修改本地的地址

Windows下git如何修改本地默认下载仓库地址 - 简书 (jianshu.com) 详细解释: 打开终端拉取git时,会默认在git安装的地方,也就是终端前面的地址。 需要将代码 拉取到D盘的话,现在D盘创建好需要安放代码的文件夹,然后…

监控无人机项目

监控无人机的开发涉及多个方面,涵盖硬件、软件和网络等领域。下面是一般情况下开发监控无人机系统的主要步骤: 确定需求和功能:明确您的监控无人机系统的目标和应用场景,确定需要的功能和特性,例如实时视频监控、目标…

Linux中软件RAID的使用

在Linux系统中目前以MD (Multiple Devices)虚拟块设备的方式实现软件RAID,利用多个底层的块设备虚拟出一个新的虚拟块设备,并且利用条带化(stripping)技术将数据块均匀分布到多个磁盘上来提高虚拟设备的读写性能,利用不同的数据冗余算法来保护…

聚焦甲烷循环,宏基因组分析项目再创新!

甲烷,化学式CH4,在自然界分布很广,是最简单的有机物,也是最简单的烃。但同时也是一种重要的温室气体,是一种仅次于二氧化碳的强大温室气体,对环境和全球变化具有重大影响,其导致全球变暖潜力是C…

C++ has a different exception specifier

这个报错: error: declaration of ‘virtual const void* int8EntroyCalibrator::readCalibrationCache (std::size_t&)’ has a different exception specifier正常来说就是你声明的函数定义和真正函数实现的时候,参数或者函数类型不一致&#xff…

uniapp使用getStorage对属性赋值无效

1正常set(get)storage都是可以正常使用的 2.但对属性进行赋值的时候,却发现this.name并没有发生变化 3. 在里面打印this发现,在set*getStorage中并不能拿到this. 4.优化代码 这样就可以给this.name成功赋值

Python 装饰器该如何理解?

哈喽大家好,今天带大家了解下在Python中装饰器的使用 定义 首先我们先来了解下装饰器的定义。顾名思义,在Python中,装饰器本质上就是一个函数,它可以接收一个函数作为参数,然后返回一个新的函数。这个新的函数可以在…

Redis(主从复制、哨兵模式、集群)概述及部署

文章目录 一、Redis模式二、Redis 持久化1.Redis 提供两种方式进行持久化:2.RDB 持久化2.1 触发条件2.2 执行流程2.3 启动时加载 3.AOF持久化3.1 执行流程3.1.1 命令追加(append)3.1.2 文件写入(write)和文件同步(sync)3.1.3 文件重写(rewrite) 3.2 文件重写的触发&…

flutter开发实战-显示本地图片网络图片及缓存目录图片

flutter开发实战-显示本地图片网络图片及缓存目录图片 在最近开发中碰到了需要显示缓存目录图片,这里顺便整理一下,显示本地图片、网络图片、缓存目录图片的方法。 一、工程本地图片显示 1 在项目根目录下创建名为 images文件夹,也可以将i…

JavaFX知识了解

这篇文章的内容是和某PT问答对话而来的,不得不说很快很方便的了解了JavaFX的知识,真的是很强大。 虽然Java Swing也能做UI,并且跨平台,但是JavaFX提供了更优秀的一个选项,值得业余探索和了解学习。桌面软件开发现在选项…

uni-app点击按钮弹出提示框(以弹窗的形式显示),选择确定和取消

学习目标: 学习目标如下所示: uni-app点击提交按钮后弹出提示框,(以弹窗的形式显示),提示用户是否确认提交(即确定和取消),点击确定后调用真正的提交方法,将数据传给后端…

【计算机视觉|人脸建模】3D人脸重建基础知识(入门)

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 一、三维重建基础 三维重建(3D Reconstruction)是指根据单视图或者多视图的图像重建三维信息的过程。 1. 常见三维重建技术 人工几何模型仪器采集基于图像的建模描述基于几何建模…

linux常用库记录(mqtt/json等库)

libcurl库: libcurl 是一个跨平台网络协议库,http,https,telnet,ftp等协议都支持\ jrtplib库:实时传输协议(Real-time Transport Protocol,PRT)是在 Internet 上处理多媒体数据流的一种网络协议,利用它能够在一对一(un…

20230726----重返学习-vue3项目实战-知乎日报第3天-TS-简历

day-121-one-hundred-and-twenty-one-20230726-vue3项目实战-知乎日报第3天-TS-简历 vue3项目实战-知乎日报第3天 封装按钮组件 jsx函数式组件 只能做静态页面,内部没有方法让它自动更新。 封装第三方按钮-非计算属性版 封装第三方按钮-不使用计算属性 src/c…

netty 错误

项目场景: 提示:这里简述项目相关背景: 问题描述 提示:这里描述项目中遇到的问题: 七月 28, 2023 11:12:49 上午 org.jboss.netty.channel.SimpleChannelHandler 警告: EXCEPTION, please implement cn.com.onlinet…

完美解决Qt error C2664: 无法将参数 1 从“const char []”转换为“char *

问题原因 C新标准不再允许将常量字符串,作为字符指针使用。对此,msvc编译环境,会报错。对此,可以在工程属性中配置“多字节字符集”来解决这个问题。 目前,使用QtCreator,同样也可以在Qt工程文件中去配置“…

Zookeeper学习笔记

0、ZooKeeper安装与集群安装 略。。。 1、Zookeeper介绍 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 1.1、Zookeeper工作机制 Zookeeper从设计模式的角度来理解:是一个基于观察者模式设计的分布式服务管理框架&#xf…

从Arweave开始:4EVERLAND存储签入挑战开始

嗨,4evers, 今天,我们热烈欢迎您参加 Galxe 上的 4EVERLAND “Arweave 入门”活动。这是一项长期的重头活动,所有参与的用户都有机会获得相应的奖励。 Arweave 是一种革命性的去中心化存储协议,为寻求安全可靠的有价…

【Linux】进程轻松入门

目录 一, 冯* 诺依曼体系结构 1,存储结构 ​编辑 二, 操作系统 1,概念 2,设计OS的目的 3,定位 4,如何理解 "管理" 5, 总结 三,进程 1. 概念 那么…