设计模式之中介者模式(十五)

news2024/11/19 19:23:18

目录

1. 背景

1.1 智能家庭管理项目

1.2 中介者模式概述

2. 中介者模式

2.1 中介者模式解决上述问题


1. 背景

1.1 智能家庭管理项目

智能家庭项目:
  • 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等。
  • 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放。
这个可以用之前外观模式来解决,但外观模式有个缺点流程是固定的,一个流程就对应一个类。
可以用到中介者模式。

1.2 中介者模式概述

  • 中介者模式(Mediator Pattern,用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  • 比如MVC模式,CController控制器)是MModel模型)和VView视图)的中 介者,在前后端交互时起到了中间人的作用。
  • 中介者模式核心是避免子系统间互相调用,可以达到解耦

 对原理类图的说明-即(中介者模式的角色及职麦)

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

2. 中介者模式

2.1 中介者模式解决上述问题

 中介者

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> colleagueMap;
	private HashMap<String, String> interMap;

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

	@Override
	public void Register(String colleagueName, Colleague colleague) {

		colleagueMap.put(colleagueName, colleague);

		if (colleague instanceof Alarm) {
			interMap.put("Alarm", colleagueName);
		} else if (colleague instanceof CoffeeMachine) {
			interMap.put("CoffeeMachine", colleagueName);
		} else if (colleague instanceof TV) {
			interMap.put("TV", colleagueName);
		} else if (colleague instanceof Curtains) {
			interMap.put("Curtains", colleagueName);
		}
	}

	//具体中介者的核心方法
	//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发现消息

		} else if (colleagueMap.get(colleagueName) instanceof Curtains) {
			//如果是以窗帘发出的消息,这里处理...
		}

	}

	@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);
}
//具体的同事类
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);
	}

	@Override
	public void SendMessage(int stateChange) {
		this.GetMediator().GetMessage(stateChange, this.name);
	}

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

	public void FinishCoffee() {
		System.out.println("After 5 minutes!");
		System.out.println("Coffee is ok!");
		SendMessage(0);
	}
}

......其他类似

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

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

相关文章

7 支持向量机

支持向量机 支持向量机(SVM)是在统计学习理论基础上发展起来的一种数据挖掘方法&#xff0c;1992 年由Boser, Guyon和Vapnik提出&#xff0c;在解决小样本、非线性、高维的回归和分类问题上&#xff0c; 有许多优势。 1 支持向量分类概述 支持向量分类以训练样本集为数据对象…

支持向量机核技巧:10个常用的核函数总结

支持向量机是一种监督学习技术&#xff0c;主要用于分类&#xff0c;也可用于回归。它的关键概念是算法搜索最佳的可用于基于标记数据(训练数据)对新数据点进行分类的超平面。 一般情况下算法试图学习一个类的最常见特征(区分一个类与另一个类的特征)&#xff0c;分类是基于学…

[附源码]JAVA毕业设计律师事务所网站(系统+LW)

[附源码]JAVA毕业设计律师事务所网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

ubuntu20.04安装anaconda3搭建python环境

1.清华源下载anaconda3 清华源anaconda软件镜像网站&#xff1a; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载完成在终端打开Downloads 运行 bash Anaconda3-5.3.1-Linux-x86_64.sh 进入到下载页面 紧接着你可以使用conda --…

HTTP抓包神器---Fiddler

今天我们介绍一个好用的抓包工具.是针对于HTTP协议的抓包工具. Fiddler 下载地址 下载工具当然是要去官网下载啦. 这里为了防止有些人在网上找不到下载路径.我们直接把下载路径放在下面. https://www.telerik.com/download/fiddler 下载 点击上述链接以后会直接跳转到下…

蓝海创意云·11月大事记 || 12月,暖心相伴

秋尽冬生&#xff0c;日短天寒 告别了立冬与小雪 时光不紧不慢开启了新一月的篇章 万物冬藏&#xff0c;沉淀酝酿 站在十二月的路口 蛰伏打磨&#xff0c;静待厚积而薄发 导 读 ● 客户端更新&#xff1a;新增PSD通道合成选项 ● 渲染案例&#xff1a;绝代双骄重启江湖…

K8S - Pod 的概念和简介

1. POD的基本概念 Pod 是K8s 系统中可以创建&#xff08;部署&#xff09;和管理的最小单元。 Pod 里面可以包含多个容器(多实例&#xff09;&#xff0c;是一组容器的集合。 也就是讲K8S 不会直接管理容器 1个POD中的容器共享网络命名空间&#xff08;共享ip&#xff09; P…

MongoDB_前期准备(一)

目录一、数据库&#xff08;Database&#xff09;数据库分类1、关系型数据库&#xff08;RDBMS&#xff09;2、非关系型数据库&#xff08;No SQL&#xff09;二、MongoDB简介1&#xff09;MongoDB VS MySql2&#xff09;MongoDB中的三个概念3&#xff09; MongoDB安装一、数据…

Reading Note(10)——AutoBridge

这篇论文是FPGA 2021年的best paper award&#xff0c;主要解决的是在HLS编译过程中优化布局和布线&#xff0c;最终达到整个multi-die的FPGA板上的大规模HLS设计时钟频率尽可能提升的目的&#xff0c;这篇工作在当前chiplet工艺铺展开来的当下更加有现实意义&#xff0c;通过这…

代码随想录训练营第41天|LeetCode 343. 整数拆分、 96.不同的二叉搜索树

参考 代码随想录 题目一&#xff1a;LeetCode 343.整数拆分 确定dp数组及其下标的含义 dp[i]为整数i拆分后得到的最大化乘积。确定递推公式 dp[i]可以有两种方式得到&#xff1a; dp[i] j * (i-j)&#xff0c;即只拆分成两个数&#xff0c;其中1 < j < i/2&#xff…

Nginx的高可用集群

1、什么是 nginx高可用 只有一台nginx服务器时&#xff0c;如果nginx服务器宕机了&#xff0c;那么请求就无法访问。 要实现高可用&#xff0c;那就可以部署多台nginx服务器&#xff0c;下面以两台nginx服务器为例&#xff0c;示意图如下&#xff1a; 要配置nginx集群&#xf…

西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第22期目录

百年党建与马克思主义中国化研究 党的纪律建设的实践、启示与创新——基于“三大纪律八项注意”的研究 武艳; 5-8 西部研究《西部学刊》投稿&#xff1a;cn7kantougao163.com 新疆红色资源运用现状调查研究——以南疆部分地区为例 王艺潼;努尔古扎丽阿不都克里木; 9-12…

BP神经网络对指纹识别的应用(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在现代计算机具有强大的计算和信息处理能力的今天,指纹识别作为个人身份鉴定等领域的热点问题一直被人们长期关注着,目前也得到…

版本控制 | 一文了解什么是组件化开发,以及如何从单体架构转向组件化开发

传统开发模式中&#xff0c;所有代码都写在APP模块中。随着项目的发展&#xff0c;代码量逐渐庞大&#xff0c;编译时间越来越长。为了方便后续项目的开发和测试、提高编译性能&#xff0c;您需要了解组件化开发&#xff0c;以及如何利用版本控制系统从单体架构转向组件化开发。…

【Python自然语言处理】使用SVM、随机森林法、梯度法等多种方法对病人罹患癌症预测实战(超详细 附源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、数据集背景 乳腺癌数据集是由加州大学欧文分校维护的 UCI 机器学习存储库。 数据集包含 569 个恶性和良性肿瘤细胞样本。 样本类别分布&#xff1a;良性357&#xff0c;恶性212 数据集中的前两列分别存储样本的唯一 …

Prototypical Networks for Few-shot Learning

摘要 我们为零样本分类问题提出了一个原型网络。在这里分类器必须能够被泛化到新类别&#xff08;在训练集中不可见&#xff09;&#xff0c;每个新类只给出少量示例。 原型网络能够学习一个度量空间&#xff0c;通过计算每个类别的原型表示距离实现分类。与少样本学习近几年的…

华为机试 - 完全二叉树非叶子部分后序遍历

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定一个以顺序储存结构存储整数值的完全二叉树序列&#xff08;最多1000个整数&#xff09;&#xff0c;请找出此完全二叉树的所有非叶子节点部分&#xff0c;然后采用后序遍历方式将此部分树&#x…

AOP事务管理(下)

Transactional注解可以设置参数。 readOnly&#xff1a;true只读事务&#xff0c;false读写事务&#xff0c;增删改要设为false,查询设为true。 timeout:设置超时时间单位秒&#xff0c;在多长时间之内事务没有提交成功就自动回滚&#xff0c;-1表示不设置超 时时间。 rollbac…

熬夜也要肝完的阿里内部面试官手册,吃透直接拿下大厂心仪 offer

前言 蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#…

ASP.NET通用版权限管理系统源码分享

ASP.NET通用版权限管理系统源码 源码分享&#xff01;需要源码学习可私信我。 主要功能有&#xff1a;权限管理、角色管理、部门管理、用户管理、公司管理、模块管理、系统设置。 一、 权限管理 以关键字&#xff08;Key&#xff09;的方式来定义系统的权限&#xff0c;使系统…