案例

智能家庭项目:
1) 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等
2) 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流
程为: 闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放

传统方案

image.png

原本image.png
传统问题分析

当各电器对象有多种状态改变时,相互之前的调用关系会比较复杂
各个电器对象,你中有我,我中有你,不利于耦合
各个电子对象之间所传递的消息容易混乱
当系统增加一个新的电器对象时候,执行流程,代码可维护性,扩展性不理想


中介者模式

修改后
image.png

中介者模式(Mediator Pattern)用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互

UML类图
image.png

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

智能家庭Uml

image.png

1:创建ConCreMediator对象
2:创建各个同事类 Alarm ,CoffeeMachine 对象,在创建这个对象的同时,通过构造器加入到ColleagueMap中
3:同事类对象,可以调用sendMessage,最终回去调用ConcreMediator.getMessage方法
4:getMessage 会根据接收到的同事对象发出的消息来协调调用其他的同事对象完成相应任务

  1. public abstract class Mediator {
  2. //将给中介者对象,加入到集合中
  3. public abstract void Register(String colleagueName, Colleague colleague);
  4. //接收消息, 具体的同事对象发出
  5. public abstract void GetMessage(int stateChange, String colleagueName);
  6. public abstract void SendMessage();
  7. }
  8. //具体的中介者类
  9. public class ConcreteMediator extends Mediator {
  10. //集合,放入所有的同事对象
  11. private HashMap<String, Colleague> colleagueMap;
  12. private HashMap<String, String> interMap;
  13. public ConcreteMediator() {
  14. colleagueMap = new HashMap<String, Colleague>();
  15. interMap = new HashMap<String, String>();
  16. }
  17. @Override
  18. public void Register(String colleagueName, Colleague colleague) {
  19. // TODO Auto-generated method stub
  20. colleagueMap.put(colleagueName, colleague);
  21. // TODO Auto-generated method stub
  22. if (colleague instanceof Alarm) {
  23. interMap.put("Alarm", colleagueName);
  24. } else if (colleague instanceof CoffeeMachine) {
  25. interMap.put("CoffeeMachine", colleagueName);
  26. } else if (colleague instanceof TV) {
  27. interMap.put("TV", colleagueName);
  28. } else if (colleague instanceof Curtains) {
  29. interMap.put("Curtains", colleagueName);
  30. }
  31. }
  32. //具体中介者的核心方法
  33. //1. 根据得到消息,完成对应任务
  34. //2. 中介者在这个方法,协调各个具体的同事对象,完成任务
  35. @Override
  36. public void GetMessage(int stateChange, String colleagueName) {
  37. // TODO Auto-generated method stub
  38. //处理闹钟发出的消息
  39. if (colleagueMap.get(colleagueName) instanceof Alarm) {
  40. if (stateChange == 0) {
  41. ((CoffeeMachine) (colleagueMap.get(interMap
  42. .get("CoffeeMachine")))).StartCoffee();
  43. ((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();
  44. } else if (stateChange == 1) {
  45. ((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();
  46. }
  47. } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {
  48. ((Curtains) (colleagueMap.get(interMap.get("Curtains"))))
  49. .UpCurtains();
  50. } else if (colleagueMap.get(colleagueName) instanceof TV) {//如果TV发现消息
  51. } else if (colleagueMap.get(colleagueName) instanceof Curtains) {
  52. //如果是以窗帘发出的消息,这里处理...
  53. }
  54. }
  55. @Override
  56. public void SendMessage() {
  57. // TODO Auto-generated method stub
  58. }
  59. }
  1. //同事抽象类
  2. public abstract class Colleague {
  3. private Mediator mediator;
  4. public String name;
  5. public Colleague(Mediator mediator, String name) {
  6. this.mediator = mediator;
  7. this.name = name;
  8. }
  9. public Mediator GetMediator() {
  10. return this.mediator;
  11. }
  12. public abstract void SendMessage(int stateChange);
  13. }
  14. public class CoffeeMachine extends Colleague {
  15. public CoffeeMachine(Mediator mediator, String name) {
  16. super(mediator, name);
  17. // TODO Auto-generated constructor stub
  18. mediator.Register(name, this);
  19. }
  20. @Override
  21. public void SendMessage(int stateChange) {
  22. // TODO Auto-generated method stub
  23. this.GetMediator().GetMessage(stateChange, this.name);
  24. }
  25. public void StartCoffee() {
  26. System.out.println("It's time to startcoffee!");
  27. }
  28. public void FinishCoffee() {
  29. System.out.println("After 5 minutes!");
  30. System.out.println("Coffee is ok!");
  31. SendMessage(0);
  32. }
  33. }
  34. public class TV extends Colleague {
  35. public TV(Mediator mediator, String name) {
  36. super(mediator, name);
  37. // TODO Auto-generated constructor stub
  38. mediator.Register(name, this);
  39. }
  40. @Override
  41. public void SendMessage(int stateChange) {
  42. // TODO Auto-generated method stub
  43. this.GetMediator().GetMessage(stateChange, this.name);
  44. }
  45. public void StartTv() {
  46. // TODO Auto-generated method stub
  47. System.out.println("It's time to StartTv!");
  48. }
  49. public void StopTv() {
  50. // TODO Auto-generated method stub
  51. System.out.println("StopTv!");
  52. }
  53. }
  1. public static void main(String[] args) {
  2. //创建一个中介者对象
  3. Mediator mediator = new ConcreteMediator();
  4. //创建Alarm 并且加入到 ConcreteMediator 对象的HashMap
  5. Alarm alarm = new Alarm(mediator, "alarm");
  6. //创建了CoffeeMachine 对象,并 且加入到 ConcreteMediator 对象的HashMap
  7. CoffeeMachine coffeeMachine = new CoffeeMachine(mediator,
  8. "coffeeMachine");
  9. //创建 Curtains , 并 且加入到 ConcreteMediator 对象的HashMap
  10. Curtains curtains = new Curtains(mediator, "curtains");
  11. TV tV = new TV(mediator, "TV");
  12. //让闹钟发出消息
  13. alarm.SendAlarm(0);
  14. coffeeMachine.FinishCoffee();
  15. alarm.SendAlarm(1);
  16. }