设计模式-11-外观模式

设计模式-11-外观模式

个人github地址:HibisciDai

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

processon在线UML类图:processon

[TOC]

设计模式-11-外观模式

外观模式(Facade Pattern)

意图

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

简介

隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式,向现有系统提供添加了一个接口,来隐藏系统的复杂性。
这种模式涉及了一个单一的类,提供了客户端请求的简化方法和对现有系统类方法的委托调用。

主要解决

降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

何时使用

  • 客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可。
  • 定义系统的入口。

关键代码

在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

如何解决

客户端不与系统耦合,外观类与系统耦合。

应用实例

  • 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
  • JAVA 的三层开发模式。
  • 电脑的例子更形象:
    电脑整机是CUP、内存、硬盘的外观。有了外观以后,启动电脑和关闭电脑都简化了。
    启动电脑(按一下电源键):启动CPU、启动内存、启动硬盘
    关闭电脑(按一下电源键):关闭硬盘、关闭内存、关闭CPU

优点

  • 减少系统相互依赖。
  • 提高灵活性。
  • 提高了安全性。

缺点

不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

使用场景

  • 为复杂的模块或子系统提供外界访问的模块。
  • 子系统相对独立。
  • 预防低水平人员带来的风险。

注意事项

在层次化结构中,可以使用外观模式定义系统中每一层的入口。

补充

  • 抽象工厂模式,可代替其模式隐藏细节。
  • 单例模式中,Facade对象常为Singleton模式

案例1

模拟一个取钱过程

类图

代码

pattern11.facade.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
public class NingLi {
void fetchAndCarry() {
System.out.println("搬");
}
}

public class XiaoBai {
void install() {
System.out.println("安装");
}
}

public class Doraemon {
void account() {
System.out.println("结算");
}
}

public class SuperMan {
void protect() {
System.out.println("保护");
}
}

public class Other {
void other() {
System.out.println("其他");
}
}

public class Facade {
NingLi nl = new NingLi();
XiaoBai xb = new XiaoBai();
Doraemon dn = new Doraemon();
SuperMan sm = new SuperMan();
Other o = new Other();

void DrawMoney() {
nl.fetchAndCarry();
sm.protect();
dn.account();
o.other();
}

void installSoftWare() {
xb.install();
dn.account();
}
}

测试输出

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Facade f = new Facade();
f.DrawMoney();
}
}
1
2
3
4

保护
结算
其他

案例2

投影仪放电影有很多操作,现在需要提供一个方便看电影的类。

类图

代码

pattern11.facade.demo2

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
public class Projector {
void up() {
System.out.println("Projector-开");
}

void down() {
System.out.println("Projector-关");
}
}

public class CD {
void on() {
System.out.println("CD-放入");
}

void off() {
System.out.println("CD-拿出");
}

void play() {
System.out.println("CD-播放");
}
}

public class DVD {
void on() {
System.out.println("DVD-开");
}

void off() {
System.out.println("DVD-关");
}

void play() {
System.out.println("DVD-播放");
}
}

public class Light {
void on() {
System.out.println("Light-开");
}

void off() {
System.out.println("Light-关");
}
}

public class Movie {
private Projector p;
private CD c;
private DVD d;
private Light l;

public Movie() {
p = new Projector();
c = new CD();
d = new DVD();
l = new Light();
}

public void watch() {
p.up();
l.off();
d.on();
c.on();
c.play();
d.play();
d.off();
c.off();
l.on();
p.down();
}
}

测试输出

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Movie m = new Movie();
m.watch();
}
}
1
2
3
4
5
6
7
8
9
10
Projector-开
Light-关
DVD-开
CD-放入
CD-播放
DVD-播放
DVD-关
CD-拿出
Light-开
Projector-关

案例3

详见 菜鸟教程

文章作者: HibisciDai
文章链接: http://hibiscidai.com/2018/04/23/设计模式-11-外观模式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里