Skip to content

Commit bd4247e

Browse files
committed
iluwatar#590 Add explanation for Facade pattern
1 parent a745c5d commit bd4247e

6 files changed

Lines changed: 183 additions & 149 deletions

File tree

facade/README.md

Lines changed: 182 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,188 @@ tags:
1515
Provide a unified interface to a set of interfaces in a subsystem.
1616
Facade defines a higher-level interface that makes the subsystem easier to use.
1717

18-
![alt text](./etc/facade_1.png "Facade")
18+
## Explanation
19+
20+
Real world example
21+
22+
> How does a goldmine work? "Well, the miners go down there and dig gold!" you say. That is what you believe because you are using a simple interface that goldmine provides on the outside, internally it has to do a lot of stuff to make it happen. This simple interface to the complex subsystem is a facade.
23+
24+
In plain words
25+
26+
> Facade pattern provides a simplified interface to a complex subsystem.
27+
28+
Wikipedia says
29+
30+
> A facade is an object that provides a simplified interface to a larger body of code, such as a class library.
31+
32+
**Programmatic Example**
33+
34+
Taking our goldmine example from above. Here we have the dwarven mine worker hierarchy
35+
36+
```
37+
public abstract class DwarvenMineWorker {
38+
39+
private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenMineWorker.class);
40+
41+
public void goToSleep() {
42+
LOGGER.info("{} goes to sleep.", name());
43+
}
44+
45+
public void wakeUp() {
46+
LOGGER.info("{} wakes up.", name());
47+
}
48+
49+
public void goHome() {
50+
LOGGER.info("{} goes home.", name());
51+
}
52+
53+
public void goToMine() {
54+
LOGGER.info("{} goes to the mine.", name());
55+
}
56+
57+
private void action(Action action) {
58+
switch (action) {
59+
case GO_TO_SLEEP:
60+
goToSleep();
61+
break;
62+
case WAKE_UP:
63+
wakeUp();
64+
break;
65+
case GO_HOME:
66+
goHome();
67+
break;
68+
case GO_TO_MINE:
69+
goToMine();
70+
break;
71+
case WORK:
72+
work();
73+
break;
74+
default:
75+
LOGGER.info("Undefined action");
76+
break;
77+
}
78+
}
79+
80+
public void action(Action... actions) {
81+
for (Action action : actions) {
82+
action(action);
83+
}
84+
}
85+
86+
public abstract void work();
87+
88+
public abstract String name();
89+
90+
static enum Action {
91+
GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK
92+
}
93+
}
94+
95+
public class DwarvenTunnelDigger extends DwarvenMineWorker {
96+
97+
private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenTunnelDigger.class);
98+
99+
@Override
100+
public void work() {
101+
LOGGER.info("{} creates another promising tunnel.", name());
102+
}
103+
104+
@Override
105+
public String name() {
106+
return "Dwarven tunnel digger";
107+
}
108+
}
109+
110+
public class DwarvenGoldDigger extends DwarvenMineWorker {
111+
112+
private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenGoldDigger.class);
113+
114+
@Override
115+
public void work() {
116+
LOGGER.info("{} digs for gold.", name());
117+
}
118+
119+
@Override
120+
public String name() {
121+
return "Dwarf gold digger";
122+
}
123+
}
124+
125+
public class DwarvenCartOperator extends DwarvenMineWorker {
126+
127+
private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenCartOperator.class);
128+
129+
@Override
130+
public void work() {
131+
LOGGER.info("{} moves gold chunks out of the mine.", name());
132+
}
133+
134+
@Override
135+
public String name() {
136+
return "Dwarf cart operator";
137+
}
138+
}
139+
140+
```
141+
142+
To operate all these goldmine workers we have the facade
143+
144+
```
145+
public class DwarvenGoldmineFacade {
146+
147+
private final List<DwarvenMineWorker> workers;
148+
149+
public DwarvenGoldmineFacade() {
150+
workers = new ArrayList<>();
151+
workers.add(new DwarvenGoldDigger());
152+
workers.add(new DwarvenCartOperator());
153+
workers.add(new DwarvenTunnelDigger());
154+
}
155+
156+
public void startNewDay() {
157+
makeActions(workers, DwarvenMineWorker.Action.WAKE_UP, DwarvenMineWorker.Action.GO_TO_MINE);
158+
}
159+
160+
public void digOutGold() {
161+
makeActions(workers, DwarvenMineWorker.Action.WORK);
162+
}
163+
164+
public void endDay() {
165+
makeActions(workers, DwarvenMineWorker.Action.GO_HOME, DwarvenMineWorker.Action.GO_TO_SLEEP);
166+
}
167+
168+
private static void makeActions(Collection<DwarvenMineWorker> workers,
169+
DwarvenMineWorker.Action... actions) {
170+
for (DwarvenMineWorker worker : workers) {
171+
worker.action(actions);
172+
}
173+
}
174+
}
175+
```
176+
177+
Now to use the facade
178+
179+
```
180+
DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade();
181+
facade.startNewDay();
182+
// Dwarf gold digger wakes up.
183+
// Dwarf gold digger goes to the mine.
184+
// Dwarf cart operator wakes up.
185+
// Dwarf cart operator goes to the mine.
186+
// Dwarven tunnel digger wakes up.
187+
// Dwarven tunnel digger goes to the mine.
188+
facade.digOutGold();
189+
// Dwarf gold digger digs for gold.
190+
// Dwarf cart operator moves gold chunks out of the mine.
191+
// Dwarven tunnel digger creates another promising tunnel.
192+
facade.endDay();
193+
// Dwarf gold digger goes home.
194+
// Dwarf gold digger goes to sleep.
195+
// Dwarf cart operator goes home.
196+
// Dwarf cart operator goes to sleep.
197+
// Dwarven tunnel digger goes home.
198+
// Dwarven tunnel digger goes to sleep.
199+
```
19200

20201
## Applicability
21202
Use the Facade pattern when

facade/etc/facade.png

-33 KB
Binary file not shown.

facade/etc/facade.ucls

Lines changed: 0 additions & 88 deletions
This file was deleted.

facade/etc/facade.urm.puml

Lines changed: 0 additions & 60 deletions
This file was deleted.

facade/etc/facade_1.png

-43.4 KB
Binary file not shown.

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@
470470
<param>bridge</param>
471471
<param>composite</param>
472472
<param>decorator</param>
473+
<param>facade</param>
473474
</skipForProjects>
474475
</configuration>
475476
</plugin>

0 commit comments

Comments
 (0)