设计模式——中介者

news2024/11/18 4:46:39

1.定义

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

2.使用场景

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

例如:1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

3.实现

/**
 * 抽象同事类:规定了具体同事需要实现的方法
 * @author Administrator
 *
 */
public abstract class Colleague {
	protected String name;
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public Colleague(String name) {
		this.name = name;
	}
	
	public abstract void sendMessage(Mediator mediator,String message);
	
	public abstract String receiveMessage(String message);
	
}
/**
 * 中介者接口:定义一个接口用于各同事(Colleague)之间的通信
 * @author Administrator
 *
 */
public interface Mediator {
	void deliverMessage(Colleague colleague,String message);
}
/**
 * 具体同事类:实现抽象类的方法,每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
 * @author Administrator
 *
 */
public class ColleagueA extends Colleague{

	public ColleagueA(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void sendMessage(Mediator mediator, String message) {
		// TODO Auto-generated method stub
		mediator.deliverMessage(this, message);
	}

	@Override
	public String receiveMessage(String message) {
		// TODO Auto-generated method stub
		System.out.println("我的名字:"+super.name+",收到消息:"+message);
		return null;
	}

}
/**
 * 具体同事类:实现抽象类的方法,每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
 * @author Administrator
 *
 */
public class ColleagueB extends Colleague{

	public ColleagueB(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void sendMessage(Mediator mediator, String message) {
		// TODO Auto-generated method stub
		mediator.deliverMessage(this, message);
	}

	@Override
	public String receiveMessage(String message) {
		// TODO Auto-generated method stub
		System.out.println("我的名字:"+super.name+",收到消息:"+message);
		return null;
	}

}
/**
 * 具体中介者:具体中介者,实现抽象中介者的方法,具体中介者需要包含所有具体同事(ConcreteColleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信要求;
 * @author Administrator
 *
 */
public class ConcreteMediator implements Mediator{
	private Colleague colleagueA;
	private Colleague colleagueB;
	
	public ConcreteMediator(Colleague colleagueA,Colleague colleagueB) {
		this.colleagueA = colleagueA;
		this.colleagueB = colleagueB;
	}

	@Override
	public void deliverMessage(Colleague colleague, String message) {
		// TODO Auto-generated method stub
		if(colleague==colleagueA) {//如果是A发来的消息,那么通知B
			colleagueB.receiveMessage(message);
		}else if(colleague==colleagueB) {//如果是B发来的消息,那么通知A
			colleagueA.receiveMessage(message);
		}
	}

}
/**
 * 测试类
 * @author Administrator
 *
 */
public class Test {
	public static void main(String[] args) {
		Colleague colleagueA = new ColleagueA("客户");
		Colleague colleagueB = new ColleagueB("商家");
		
		Mediator mediator = new ConcreteMediator(colleagueA,colleagueB);
		
		colleagueA.sendMessage(mediator, "我需要一份三明治");
		colleagueB.sendMessage(mediator, "这里有各种各样的三明治");
	}
}

运行结果:

在这里插入图片描述

4.总结

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点: 中介者会庞大,变得复杂难以维护。

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

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

相关文章

关于Nginx的那些事

关于Nginx的那些事 一、Nginx的基础nginx VS apache 二、 编译安装Nginx服务1.关闭防火墙,将安装nginx所需软件包传到/opt目录下2.安装依赖包3.创建运行用户、组4.编译安装Nginx5.检查、启动、重启、停止 nginx服务新版本升级: 6.添加 Nginx 系统服务方法…

【机器学习】正则化详解和过拟合的解决

https://blog.csdn.net/weixin_45434953/article/details/130970273 上一篇文章的例子中,如果使用一个四次多项式去拟合房价函数,会导致过拟合问题 而正则化是解决过拟合的一个方法。右图过拟合是因为其三次方项和四次方项的影响,我们再回顾…

ChatGPT们对今后社会生活的影响

探索ChatGPT,协助工作学习创作。加入「阿杰与AI」公众号,一同探讨,一同成长,比他人更进一步。 1.AI、OpenAI、MidJourney发展史2.ChatGPT们对今后社会生活的影响3.目前市面比较好的AI产品介绍4.注册方式汇总5.针对初学者的 ChatG…

C#,码海拾贝(28)——求解“对称正定方程组”的“平方根法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

淘宝618每日一猜答案(6月5日) 淘宝大赢家今日答案

淘宝6月5日每日一猜答案是什么&#xff1f;&#xff0c;接下来也会给大家来介绍一下6月5日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月5日答案分享 活动问题&#xff1a;亚特兰蒂斯体型最大的员工 活动答案&#xff1a;【白鲸】 注意&#xff1a;打开手机淘宝&#xff0c;搜…

记录 vue3 webpack 使用 iframe 遇到的坑

需求 我尝试用Vue3写一个自己的主页&#xff0c;把常用的功能集中到主页中&#xff0c;如下图 后发现一个好玩的东西&#xff0c;js实现的在网页底部出现鱼和波浪&#xff0c;如下图&#xff0c;就像想也放到自己的主页中&#xff0c;搜索后发现可以在Vue中用iframe标签直接引…

Nginx踩坑记录 配置文件中的include不能嵌套 (include的文件里不能再include其他文件了)

上一篇文章介绍了配置文件有多个位置&#xff0c;并且可以采用include实现主配置文件分文件的个性化配置模式&#xff1a;Nginx配置文件 所在路径 到底在哪&#xff1f;_身价五毛的博客-CSDN博客 然后就又踩坑了&#xff0c;include不能嵌套调用&#xff0c;即&#xff1a; …

战斗机上的无线电设备都有哪些?

无线电在我们的生活中无处不在&#xff0c;而无线电设备也有着广泛的应用。那么有没有老铁知道&#xff0c;战斗机上都有哪些无线电设备呢&#xff1f;下面河南宝蓝小编带大家一起来了解下&#xff1a; 战斗机上的无线电设备都有哪些 1、通信系统 通信系统是战斗机比较基本的…

IP-GUARD如何将触发策略的报警信息按照一定周期发送到指定邮箱?

如何将触发策略的报警信息按照一定周期发送到指定邮箱&#xff1f; 1、设置邮件服务器 控制台菜单【工具】-【选项】-【邮件报告服务器设置】中&#xff0c;设置好邮件服务器&#xff1b; 2、邮件报告设置 控制台菜单【工具】-【邮件报告设置】中&#xff0c;新建邮件配置&am…

技术的交流 思想的碰撞|2023 开放原子全球开源峰会 TOC 面对面分论坛即将启幕

由开放原子开源基金会主办的 2023 开放原子全球开源峰会 TOC 面对面分论坛即将于 6 月 13 日在北京经开区北人亦创国际会展中心隆重举办。 作为开放原子开源基金会最高技术决策机构&#xff0c;TOC&#xff08;Technical Oversight Committee&#xff09;汇聚了基金会单位的开…

大语言模型的创意能力到底几何?探索从GPT-2到GPT-4的演进

编者按&#xff1a;大语言模型可以提供许多创意性内容&#xff0c;如写诗、写小说等。那么到底应该如何评估大语言模型生成的创意性内容的水平呢&#xff1f; 本文探讨了GPT-2到GPT-4的创造性&#xff0c;并分析了这些模型在不同创造性测试中的表现。作者使用了三种测试来衡量模…

分布式事务·入门与解决·贰·Saga

文章目录 1 saga分布式事务框架1.1 分布式事务相关理论1.1.1 分布式事务的出现1.1.2 CAP定理1.1.3 BASE定理——CAP的解决思想1.1.4 分布式事务四种模式1.1.5 XA、AT与TCC模式1.1.6 Saga模式 1.2 分布式事务框架ElegentACTX对Saga模式的解决1.2.1 ElegentACTX介绍1.2.2 Elegent…

低代码开发的新趋势:公民自动化和公民开发

在企业数字化转型领域&#xff0c;公民自动化是一个比较“陌生又熟悉”的词汇&#xff0c;它在公民开发运动中引起了不小的轰动。那么&#xff0c;什么是公民自动化&#xff1f;什么是公民开发呢&#xff1f;它们之间又有什么不同之处&#xff1f; 什么是公民开发 自低代码诞生…

Neural Network学习笔记3

损失函数和反向传播网络 在进行损失函数计算后&#xff0c;再进行.backward()反向传播。 import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoader from torch…

外贸人注意!这件事不能再对客户承诺了!

你还在配合客户低开发票吗&#xff1f; 本文目录&#xff1a; 什么是低开发票&#xff1f; 低开发票有什么风险&#xff1f; 哪些国家客户喜欢低开发票&#xff1f; 哪些国家低开发票会被抓&#xff1f; 很多人认为客户索要低开发票偷税漏税是人之常情。为了加强合作关系&a…

2015 年一月联考逻辑真题

2015 年一月联考逻辑真题 真题&#xff08;2015-26&#xff09; 26.晴朗的夜晚我们可以看到满天星斗&#xff0c;其中有些是自身发光的恒星&#xff0c;有些是自身不发光但可以反射附近恒星光的行星。恒星尽管遥远&#xff0c;但是有些可以被现有的光学望远镜“看到”。和恒星不…

YOLOv8训练参数详解

全部参数表 首先罗列一下官网提供的全部参数。 1. model ✰✰✰✰✰ model: 模型文件的路径。这个参数指定了所使用的模型文件的位置&#xff0c;例如 yolov8n.pt 或 yolov8n.yaml。 选择.pt和.yaml的区别 若我们选择 yolov8n.pt这种.pt类型的文件&#xff0c;其实里面是包…

从0到1实现IOC

一、什么是 IOC 我们先来看看spring官网对IOC的定义&#xff1a; IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, argumen…

阿里工程师手打的MySQL学习笔记,轻松拿捏MySQL

我们都知道阿里经历过几次重大的技术变革&#xff0c;其中就包括放弃Oracle和Hadoop&#xff0c;全面拥抱MySQL。 讲道理其实靠OracleHadoop也能撑一撑&#xff0c;为啥偏得变。当然肯定不是因为阿里爸爸没钱&#xff0c;而是即便再花个几千万还是不能彻底解决问题&#xff0c…

压力测试遭遇大量TIME_WITE之后(这样解决)

前言&#xff1a;http协议是互联网中最常使用的应用层协议&#xff0c;它的绝大多数实现是基于TCP协议的。 目录 一 问题描述 二 问题跟踪 三 跟进分析 四 解决方法 一、问题描述 某天&#xff0c;在对一个提供http接口的后台服务进行压力测试过程中&#xff0c;我们设定了…