一、中介者模式基本介绍
1、基本介绍
(1)中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互;
(2)中介者模式属于行为型代码,使代码易于维护;
(3)比如 MVC 模式,C(Controller)是 M(Model模型)和 V(View视图)的中介者,在前后端交互时起到了中间人的作用;
2、中介者模式的原理类图
对原理类图的说明——即中介者模式的角色及职责
(1)Mediator 就是抽象中介者,定义了同事对象到中介者对象的接口;
(2)Colleague 是抽象同事类;
(3)ConcreteMediator 具体的中介者对象,实现抽象方法,它需要知道所有的具体的同事类,即以一个集合来管理 HashMap,并接受某个同事对象消息,完成相应的任务;
(4)ConcreteColleague 具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但他们都依赖中介者对象
二、中介者模式应用案例—智能家庭管理
1、应用实例要求
完成上一节的智能家庭的项目,使用中介者模式:
2、思路分析和图解(类图)
3、代码实现
抽象同事类Colleague:
1 /**
2 * ͬ同事抽象类
3 */
4 public abstract class Colleague {
5 private Mediator mediator;
6 public String name;
7
8 public Colleague(Mediator mediator, String name) {
9 this.mediator = mediator;
10 this.name = name;
11 }
12
13 public Mediator GetMediator() {
14 return this.mediator;
15 }
16
17 public abstract void SendMessage(int stateChange);
18 }
具体的同事类:
1 /**
2 *闹钟-具体的同事类
3 */
4 public class Alarm extends Colleague {
5
6 //构造器
7 public Alarm(Mediator mediator, String name) {
8 super(mediator, name);
9 //在创建 Alarm 同事对象时,将自己放入到 ConcreteMediator 对象中【集合】
10 mediator.Register(name, this);
11 }
12
13 public void SendAlarm(int stateChange) {
14 SendMessage(stateChange);
15 }
16
17 @Override
18 public void SendMessage(int stateChange) {
19 //得到中介者,调用中介者的 getMessage()
20 this.GetMediator().GetMessage(stateChange, this.name);
21 }
22
23 }
24 -------------------------------------------------------------------
25 public class TV extends Colleague {
26
27 public TV(Mediator mediator, String name) {
28 super(mediator, name);
29 mediator.Register(name, this);
30 }
31
32 @Override
33 public void SendMessage(int stateChange) {
34 this.GetMediator().GetMessage(stateChange, this.name);
35 }
36
37 public void StartTv() {
38 System.out.println("It's time to StartTv!");
39 }
40
41 public void StopTv() {
42 System.out.println("StopTv!");
43 }
44 }
45 -------------------------------------------------------------------
46 public class Curtains extends Colleague {
47
48 public Curtains(Mediator mediator, String name) {
49 super(mediator, name);
50 mediator.Register(name, this);
51 }
52
53 @Override
54 public void SendMessage(int stateChange) {
55 this.GetMediator().GetMessage(stateChange, this.name);
56 }
57
58 public void UpCurtains() {
59 System.out.println("I am holding Up Curtains!");
60 }
61
62 }
63 -------------------------------------------------------------------
64 public class CoffeeMachine extends Colleague {
65
66 public CoffeeMachine(Mediator mediator, String name) {
67 super(mediator, name);
68 mediator.Register(name, this);
69 }
70
71 @Override
72 public void SendMessage(int stateChange) {
73 this.GetMediator().GetMessage(stateChange, this.name);
74 }
75
76 public void StartCoffee() {
77 System.out.println("It's time to startcoffee!");
78 }
79
80 public void FinishCoffee() {
81
82 System.out.println("After 5 minutes!");
83 System.out.println("Coffee is ok!");
84 SendMessage(0);
85 }
86 }
抽象中介者Mediator:
1 public abstract class Mediator {
2 // 将同事类对象,加入到集合中
3 public abstract void Register(String colleagueName, Colleague colleague);
4
5 //接收消息,具体的 同事 对象发出的消息
6 public abstract void GetMessage(int stateChange, String colleagueName);
7
8 public abstract void SendMessage();
9 }
具体中介者ConcreteMediator:
1 /**
2 * 具体的中介者类
3 */
4 public class ConcreteMediator extends Mediator {
5 //集合,放入所有的同事对象
6 private HashMap<String, Colleague> colleagueMap;
7 private HashMap<String, String> interMap;
8
9 public ConcreteMediator() {
10 colleagueMap = new HashMap<String, Colleague>();
11 interMap = new HashMap<String, String>();
12 }
13
14 @Override
15 public void Register(String colleagueName, Colleague colleague) {
16 colleagueMap.put(colleagueName, colleague);
17
18
19 if (colleague instanceof Alarm) {
20 interMap.put("Alarm", colleagueName);
21 } else if (colleague instanceof CoffeeMachine) {
22 interMap.put("CoffeeMachine", colleagueName);
23 } else if (colleague instanceof TV) {
24 interMap.put("TV", colleagueName);
25 } else if (colleague instanceof Curtains) {
26 interMap.put("Curtains", colleagueName);
27 }
28
29 }
30
31 //具体中介者的核心方法
32 //1.根据得到消息,完成对应任务
33 //2.中介者在这个方法中,协调各个具体的同事对象,完成任务
34 @Override
35 public void GetMessage(int stateChange, String colleagueName) {
36
37 if (colleagueMap.get(colleagueName) instanceof Alarm) {
38 if (stateChange == 0) {
39 ((CoffeeMachine) (colleagueMap.get(interMap
40 .get("CoffeeMachine")))).StartCoffee();
41 ((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();
42 } else if (stateChange == 1) {
43 ((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();
44 }
45
46 } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {
47 ((Curtains) (colleagueMap.get(interMap.get("Curtains"))))
48 .UpCurtains();
49
50 } else if (colleagueMap.get(colleagueName) instanceof TV) {//如果是TV发出消息,这里处理
51
52 } else if (colleagueMap.get(colleagueName) instanceof Curtains) {
53 //如果是窗帘发出的消息,这里处理
54 }
55
56 }
57
58 @Override
59 public void SendMessage() {
60
61 }
62 }
客户端:
1 public class ClientTest {
2
3 public static void main(String[] args) {
4 //创建一个中介者对象
5 Mediator mediator = new ConcreteMediator();
6
7 //创建 Alarm 并且加入到 concreteMediator 对象的 HashMap 中
8 Alarm alarm = new Alarm(mediator, "alarm");
9
10 //创建 CoffeeMachine 并且加入到 ConcreteMediator 对象的 HashMap
11 CoffeeMachine coffeeMachine = new CoffeeMachine(mediator,
12 "coffeeMachine");
13
14 //创建 Curtains , 并且加入到 ConcreteMediator 对象的 HashMap
15 Curtains curtains = new Curtains(mediator, "curtains");
16 TV tV = new TV(mediator, "TV");
17
18 //让闹钟发出消息
19 alarm.SendAlarm(0);
20 coffeeMachine.FinishCoffee();
21 alarm.SendAlarm(1);
22 }
23
24 }