设计模式-17-中介者模式

设计模式-17-中介者模式

个人github地址:HibisciDai

设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai

processon在线UML类图:processon

[TOC]

设计模式-17-中介者模式

中介者模式(Mediator Pattern)

意图

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

define on object that encapsulates how a set of objects interact,mediator promotes loose coaping from each other,and it lets you vary their interaction independently.

主要解决

对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用

多个类相互耦合,形成了网状结构。

关键代码

对象 Colleague 之间的通信封装到一个类中单独处理。

如何解决

将上述网状结构分离为星型结构。

应用实例

  • 中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
  • 机场调度系统。
  • MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点

  • 降低了类的复杂度,将一对多转化成了一对一。
  • 各个类之间的解耦。
  • 符合迪米特原则。

缺点

中介者会庞大,变得复杂难以维护。

使用场景

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项

不应当在职责混乱的时候使用。

相关模式

  • 外观模式(Facade)
    它对一个对象子系统进行抽象,从而提供一个更为方便的接口。协议单向,由Facade对这个子系统类提出请求,反之不行,但该模式提供各类对象不支持或不能支持的写作行为,协议为多向的。
  • 中介者模式(Mediator)
    抽象已有类的一些功能,对同事之间的任意通讯进行抽象,通常晋中不属于任何单个对象的功能,知道中介者并与它通信而不是直接与其他同类对象通信。

案例1

Sea : flood -> Sky : fallMoon , LifeForm : transform; 海洋海啸-天空满月-生物灭绝
LifeForm : dieOut -> Sea : driedUp , Sky : gray; 生物灭绝-海洋干枯-天空变灰
Sky : sunny -> Sea : evaporate , LifeForm : grow; 天空晴-海洋蒸发-生物生长

类图

原类图:

代码

pattern17.mediator.demo1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public abstract class Mediator {
abstract void excute(String type);
}

public class Concreate extends Mediator {
@Override
void excute(String type) {
Sky sky = new Sky();
Sea sea = new Sea();
LifeForm lf = new LifeForm();
switch (type) {
case "f": // 接收到 Sea:flood()
sky.fullMood();
lf.transForm();
break;
case "s": // 接收到Sky:sunny()
sea.eraporate();
lf.grow();
break;
case "d": // 接收到LifeForm:dieOut()
sky.gray();
sea.diredup();
break;
}
}
}

public abstract class Nature {
Mediator m = new Concreate();
}

public class Sky extends Nature {
void sunny() {
System.out.println("晴朗");
m.excute("s");
}

void fullMood() {
System.out.println("满月");
}

void gray() {
System.out.println("灰暗");
}
}

public class Sea extends Nature {
void flood() {
System.out.println("涨潮");
m.excute("f");
}

void diredup() {
System.out.println("干枯");
}

void eraporate() {
System.out.println("蒸发");
}
}

public class LifeForm extends Nature {
void transForm() {
System.out.println("生物变形");
}

void grow() {
System.out.println("生物生长");
}

void dieOut() {
System.out.println("生物灭绝");
m.excute("d");
}
}

测试输出

1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
Sky s = new Sky();
s.sunny();
Sea h = new Sea();
h.flood();
LifeForm l = new LifeForm();
l.dieOut();
}
}
1
2
3
4
5
6
7
8
9
晴朗
蒸发
生物生长
涨潮
满月
生物变形
生物灭绝
灰暗
干枯
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2018/05/21/设计模式-17-中介者模式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里