尚硅谷设计模式学习(19)---[中介者模式(Mediator Pattern)]

本文通过智能家庭设备协同工作的场景,深入讲解了设计模式中的中介者模式。案例中,中介者负责协调电视机、咖啡机等电器的工作流程,降低了设备间的耦合度,实现了模块间的独立性。通过中介者,当电器状态改变时,能够通过中介者进行通信,简化了系统内部的交互复杂性。文章还提供了具体的Java代码实现,包括电器抽象类、具体电器类和中介者类的详细代码,展示了中介者模式在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

尚硅谷传送门==>B站尚硅谷Java设计模式

❤❤❤感谢尚硅谷❤❤❤

最近开始计划学习一下设计模式了,加油!!!


案例智能家庭项目:

  • 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘等
  • 例如看电视之前,各个设备可以协同工作,自动完成看电视的准备工作,完成一系列流程工作.

这样的案例类似于之前的外观模式(电影院案例);

先看另一个案例;
比如说;某人要去租房,但是房主A要和房主B去商量,房主B要和房主C商量;

现在让中介者来解决问题;中介直接和三个房主分别沟通;减少了子系统之间的交流和联系.

在这里插入图片描述

那么放在当前的家用电器管理案例中;
当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂;电器直接的耦合度过高.

中介者模式

中介对象来封装底层一系列的对象交互。中介者使各个对象不需要显式地相互引用,可独立地改变它们之间的交互.

在MVC三层架构中的C 控制层就充当了中介者的角色.

子系统之间相互独立,没有直接联系
中介者承担了较多的责任,要是中介者出现问题,整个系统就会受到影响.

在这里插入图片描述


在家用电器的案例中;

大体流程;
先创建出具体的中介者实现类对象,
然后根据电器类分出子类电器(电视机,咖啡机…)的对象;
电器子类对象调用方法 sendMessage,最终会调用到中介者实现类的方法getMessage;

在这里插入图片描述

电器类Colleague

//电器类; 上级抽象类;
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);
		//添加到集合中;
		mediator.Register(name, this);
	}

	//设置闹钟;
	public void SendAlarm(int stateChange) {
		SendMessage(stateChange);
	}

	@Override
	public void SendMessage(int stateChange) {
		//调用的是中介者纷纷,让它获取消息;
		this.GetMediator().GetMessage(stateChange, this.name);
	}
}

咖啡机

//咖啡机;
public class Coffee extends Colleague {
	//初始化;
	public Coffee(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("咖啡机开启!");
	}

	//咖啡机结束
	public void FinishCoffee() {
		System.out.println("大约10分钟后");
		System.out.println("咖啡好了");
		SendMessage(0);
	}
}

电视机

//电视机;
public class TV extends Colleague {
	//初始化;
	public TV(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 StartTv() {
		System.out.println("电视机开开开");
	}

	//关电视;
	public void StopTv() {
		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> 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 Coffee) {
			interMap.put("Coffee", colleagueName);
		} else if (colleague instanceof TV) {
			interMap.put("TV", colleagueName);
		}

	}

	//接收消息;
	@Override
	public void GetMessage(int stateChange, String colleagueName) {
		if (colleagueMap.get(colleagueName) instanceof Alarm) {
			if (stateChange == 100) {
				//开咖啡机;
				((Coffee) (colleagueMap.get(interMap.get("Coffee")))).StartCoffee();
				//开电视;
				((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();
			} else if (stateChange == 369) {
				//关电视;
				((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();
			}
		}
	}

	@Override
	public void SendMessage() {}

}

模拟客户端

public class Client {
	public static void main(String[] args) {
		//创建中介者对象;
		Mediator mediator = new ConcreteMediator();
		//创建闹钟;--->加入到中介者的集合;
		Alarm alarm = new Alarm(mediator, "alarm");
		//创建咖啡机--->加入到中介者的集合;
		Coffee coffee = new Coffee(mediator, "coffee");
		//创建电视机--->加入到中介者的集合;
		TV tV = new TV(mediator, "TV");
		//开咖啡机,开电视机;
		alarm.SendAlarm(100);
		System.out.println("-----------");
		//关咖啡机;
		coffee.FinishCoffee();
		System.out.println("-----------");
		//关闭电视机
		alarm.SendAlarm(369);
	}
}

/*
咖啡机开启!
电视机开开开
-----------
大约10分钟后
咖啡好了
-----------
关闭电视机
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小智RE0-走在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值