Facade Pattern 表象模式 [Design Pattern in Java]

Posted by Kubeguts on 2020-07-29

將複雜的類別關係, 用一個類別包裝起來, 供呼叫

不會讓使用者直接看到背後複雜的邏輯, 只會看到 “表面的現象”, 故叫做表象模式

以一個家庭劇院來解說

如果坐在客廳, 想要營造一個家庭劇院

我們得做以下事情:

  1. 打開燈, 調整亮度
  2. 打開電視, 切換到DVD模式
  3. 打開音響, 調整大小聲
  4. 打開DVD, 讀取要看的片

等等之類的, 以下定義這些服務的class

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
class LightService {
LightService() {}

public void lightOn() {
System.out.println("Turn on the light");
}
}

class TVService {
TVService() {}

public void openTV() {
System.out.println("Turn on the TV");
}
}

class SoundService {
SoundService() {}

public void openSound() {
System.out.println("Turn on the Sound");
}
}

class DVDPlayerService {
DVDPlayerService() {}

public void openDVD() {
System.out.println("Turn on the DVD");
}
}

然後直覺上會呼叫之

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public class main {
public static void main(String[] args) {
LightService lightService = new LightService();
TVService tvService = new TVService();
SoundService soundService = new SoundService();
DVDPlayerService dvdPlayerService = new DVDPlayerService();

lightService.lightOn();
tvService.openTV();
soundService.openSound();
dvdPlayerService.openDVD();
}
}

其結果為:

表象模式登場

不過對於使用者來說, 其實就只想要享受家庭劇院的娛樂, 所以其實我們可以用包裝的方式, 將上面main裡面相關服務的class都包在一個class內, 叫做MovieTheaterFacadeService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

class MovieTheaterFacadeService {
MovieTheaterFacadeService() {}

public void startMovieTheaterService() {
LightService lightService = new LightService();
TVService tvService = new TVService();
SoundService soundService = new SoundService();
DVDPlayerService dvdPlayerService = new DVDPlayerService();

lightService.lightOn();
tvService.openTV();
soundService.openSound();
dvdPlayerService.openDVD();
}
}

如此一來, 我們的使用者(main()), 只要呼叫 MovieTheaterFacadeService 就可以直接享受家庭劇院, 不用親自去處理過程中的事

1
2
3
4
5
6
7
public class main {
public static void main(String[] args) {
MovieTheaterFacadeService movieTheaterFacadeService = new MovieTheaterFacadeService();

movieTheaterFacadeService.startMovieTheaterService();
}
}

總結

透過以上的例子, 可以看到表象模式最大的用處就是將複雜的服務類別們給包裝在一起, 並開放單一個類別供使用者使用, 讓使用者僅需要看到表面即可, 不用理解細節是什麼。