尚硅谷设计模式学习(19)---[中介者模式(Mediator Pattern)]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷设计模式学习(19)---[中介者模式(Mediator Pattern)]相关的知识,希望对你有一定的参考价值。
尚硅谷传送门==>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分钟后
咖啡好了
-----------
关闭电视机
*/
以上是关于尚硅谷设计模式学习(19)---[中介者模式(Mediator Pattern)]的主要内容,如果未能解决你的问题,请参考以下文章
尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]