尚硅谷设计模式学习(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)]的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷设计模式学习---[装饰者模式]

尚硅谷设计模式学习---[单例模式]

尚硅谷设计模式学习---[桥接模式(Bridge)]

尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]

尚硅谷设计模式学习---[简单工厂模式,工厂方法模式,抽象工厂模式]

尚硅谷设计模式学习(17)---[迭代器模式(Iterator Pattern)]