[摘要]门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对(Facade)象进行,本文介绍Java设计模式 之门面模式(Facade)
门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对(Facade)象进行。
迪米特法则:只与你直接的朋友们通信。
此设计模式需要一个设计不是很好的系统进行改造来进行对比Facade倒底做些什么。
以下为一个设计不是很好的系统:

可以看出,Client对象需要引用到所有的Camera,Light,Sensor,Alarm对象。Client必须对保安系统全知全能,这是一个不利于复用的做法,源代码如下所示:
|
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
//Client.javapackage
com.javapatterns.facade.security; public
class
Client{ static
private
Camera camera1 = new
Camera(); static
private
Camera camera2 = new
Camera(); static
private
Light light1 = new
Light(); static
private
Light light2 = new
Light(); static
private
Light light3 = new
Light(); static
private
Sensor sensor = new
Sensor(); static
private
Alarm alarm = new
Alarm(); public
static
void
main(String[] args) { camera1.turnOn(); camera2.turnOn(); light1.turnOn(); light2.turnOn(); light3.turnOn(); sensor.activate(); alarm.activate(); } } //Camera.javapackage
com.javapatterns.facade.security; public
class
Camera{ public
void
turnOn() { System.out.println("Turning
on the camera."); } public
void
turnOff() { System.out.println("Turning
off the camera."); } public
void
rotate(int
degrees) { System.out.println("rotating
the camera by "
+ degrees + "
degrees."); }} //Light.javapackage
com.javapatterns.facade.security; public
class
Light{ public
void
turnOn() { System.out.println("Turning
on the Light."); } public
void
turnOff() { System.out.println("Turning
off the Light."); } public
void
changeBulb() { System.out.println("changing
the light-bulb."); }} //Sensor.javapackage
com.javapatterns.facade.security; public
class
Sensor{ public
void
activate() { System.out.println("Activating
the sensor."); } public
void
deactivate() { System.out.println("Deactivating
the sensor."); } public
void
trigger() { System.out.println("The
sensor has been triggered."); }} //Alarm.javapackage
com.javapatterns.facade.security; public
class
Alarm{ public
void
activate() { System.out.println("Activating
the alarm."); } public
void
deactivate() { System.out.println("Deactivating
the alarm."); } public
void
ring() { System.out.println("Ringing
the alarm."); } public
void
stopRing() { System.out.println("Ringing
stopped."); }} |
一个合情合理的改进方法就是准备一个系统的控制台,作为安保系统的用户界面。用户只需要操作这个简化的界面就可以操控所有的内部仪器,这实际上就是门面模式的用意。
如下所示的设计图:

可以看出,门面SecurityFacade对象承担了与保安系统内部各个对象打交道的任务,而客户对象只需要与门面对象打交道即可。
这是客户端与保安系统之间的一个门户,使得客户端与子系统之间的关系变得简单和易于管理。
|
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
//Client.javapackage
com.javapatterns.facade.securityfacade; public
class
Client{ private
static
SecurityFacade security = new
SecurityFacade(); public
static
void
main(String[] args) { security.activate(); }} //SecurityFacade.javapackage
com.javapatterns.facade.securityfacade; public
class
SecurityFacade{ private
Camera camera1 = new
Camera(); private
Camera camera2 = new
Camera(); private
Light light1 = new
Light(); private
Light light2 = new
Light(); private
Light light3 = new
Light(); private
Sensor sensor = new
Sensor(); private
Alarm alarm = new
Alarm(); public
void
activate() { camera1.turnOn(); camera2.turnOn(); light1.turnOn(); light2.turnOn(); light3.turnOn(); sensor.activate(); alarm.activate(); } public
void
deactivate() { camera1.turnOff(); camera2.turnOff(); light1.turnOff(); light2.turnOff(); light3.turnOff(); sensor.deactivate(); alarm.deactivate(); } } //Camera.javapackage
com.javapatterns.facade.securityfacade; public
class
Camera{ public
void
turnOn() { System.out.println("Turning
on the camera."); } public
void
turnOff() { System.out.println("Turning
off the camera."); } public
void
rotate(int
degrees) { System.out.println("Rotating
the camera by "
+ degrees + "
degrees."); }} //Light.javapackage
com.javapatterns.facade.securityfacade; public
class
Light{ public
void
turnOn() { System.out.println("Turning
on the light."); } public
void
turnOff() { System.out.println("Turning
off the light."); } public
void
changeBulb() { System.out.println("Changing
the light-bulb."); }} //Sensor.javapackage
com.javapatterns.facade.securityfacade; public
class
Sensor{ public
void
activate() { System.out.println("Activating
on the sensor."); } public
void
deactivate() { System.out.println("Deactivating
on the sensor."); } public
void
trigger() { System.out.println("The
sensor has been triggered."); }} //Alarm.javapackage
com.javapatterns.facade.securityfacade; public
class
Alarm{ public
void
activate() { System.out.println("Activating
the alarm."); } public
void
deactivate() { System.out.println("Deactivating
the alarm."); } public
void
ring() { System.out.println("Ring
the alarm."); } public
void
stopRing() { System.out.println("Stop
the alarm."); }} |
本文介绍如何使用门面模式简化一个复杂的安保系统,通过引入门面对象,将客户端与系统内部复杂组件的交互简化,遵循迪米特法则,实现更清晰、易于维护的系统设计。
128

被折叠的 条评论
为什么被折叠?



