本文根据尚硅谷韩顺平老师的设计模式课程编写设计模式
智能家庭项目
- 智能家庭包括各种设备,闹钟,咖啡机,电视机,窗帘等
- 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放
传统的方式的问题分析
- 当各电器对象有名种状态改变时,相互之间的调用关系会比较复杂
- 各个电器对象彼此联系,你中有我,我中有你,不利于松耦合.
- 各个电器对象之间所传递的消息(参数),容易混乱
- 当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想=>考虑中介者模式
基本介绍
- 中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对 象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
- 中介者模式属于行为型模式,使代码易于维护
- 比如MVC模式,C (Controller控制器)是M (Model模型)和V (View视图)的中介者,在前后端交互时起到了中间人的作用
角色
- Mediator 就是抽象中介者,定义了同事对象到中介者对象的接口
- Colleague 是抽象同事类
- ConcreteMediator 具体的中介者对象,实现抽象方法,他需要知道多有的具体的同事类,即一个集合来管理HashMap并接受某个同事对象消息,完成相应的任务
- ConcreteColleague 具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为,但是他们都依赖中介者对象
代码
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 mediator;
}
public abstract void SendMessage(int stateChange);
}
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 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 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("Coffee Start");
}
public void FinishCoffee() {
System.out.println("Coffee Finish");
}
}
public class ConcreteMediator extends Mediator {
private HashMap<String, Colleague> colleagueMap;
private HashMap<String, String> stringMap;
public ConcreteMediator() {
colleagueMap = new HashMap<>();
stringMap = new HashMap<>();
}
@Override
public void Register(String colleagueName, Colleague colleague) {
colleagueMap.put(colleagueName, colleague);
if (colleague instanceof Alarm){
stringMap.put("Alarm", colleagueName);
}else if (colleague instanceof CoffeeMachine){
stringMap.put("CoffeeMachine", colleagueName);
}else if (colleague instanceof TV){
stringMap.put("TV", colleagueName);
}else if (colleague instanceof Curtains){
stringMap.put("Curtains", colleagueName);
}
}
//具体中介着的核心方法
//根据得到的消息,完成对应的方法
//中介者在这个方法中,协调各个具体的类
@Override
public void getMessage(int stateChange, String colleagueName) {
if (colleagueMap.get(colleagueName) instanceof Alarm){
if (stateChange == 0){
((CoffeeMachine)(colleagueMap.get(stringMap.get("CoffeeMachine")))).StartCoffee();
((TV)(colleagueMap.get(stringMap.get("TV")))).startTv();
}else if (stateChange == 1){
((TV)(colleagueMap.get(stringMap.get("TV")))).stopTv();
}
}else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine){
((Curtains)(colleagueMap.get(stringMap.get("Curtains")))).upCurtains();
}else if (colleagueMap.get(colleagueName) instanceof TV){
//处理待定
}else if (colleagueMap.get(colleagueName) instanceof Curtains){
//处理待定
}
}
@Override
public void SendMessage() {
}
}
public class Curtains extends Colleague{
public Curtains(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 upCurtains(){
System.out.println("I am holding Up Curtains");
}
}
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("TV start");
}
public void stopTv(){
System.out.println("TV stop");
}
}
public class Client {
public static void main(String[] args) {
//创建一个中介者对象
Mediator mediator = new ConcreteMediator();
//创建一个Alarm 将自己加入到ConcreteMediator中
Alarm alarm = new Alarm(mediator,"Alarm");
CoffeeMachine coffeeMachine = new CoffeeMachine(mediator , "CoffeeMachine");
Curtains curtains = new Curtains (mediator, "Curtains");
TV tV = new TV(mediator, "TV");
alarm.SendAlarm(0);
coffeeMachine.FinishCoffee();
alarm. SendAlarm(1);
}
}