設計模式詳解——外觀模式
前言
今天我們來看另一個改變介面的設計模式,不過它改變介面的原因是為了簡化介面。這個模式被巧妙地叫做外觀模式,之所以這麼稱呼,是因為它將一個或多個類的複雜的實現都藏在了背後,只顯露出一個乾淨美好的外觀。好了,下面我們就來展開分享下。
外觀模式
外觀模式提供了一個統一的介面,用來訪問子系統中的一群介面,它定義了一個高層介面,讓子系統更容易使用。下面是外觀模式的一個模型圖,核心的元素有三個,一個客戶端,一個外觀模式,另一塊是很繁雜的子系統,其中外觀模式這一層,主要是簡化子系統的介面,為客戶端提供更簡潔的呼叫:
要點
- 當需要簡化並統一一個很大的介面或者一群複雜的介面時,使用外觀模式
- 實現一個外觀模式,需要將子系統組合進外觀中,然後將工作委託給子系統執行
- 外觀將客戶從一個複雜的子系統中解耦
示例程式碼
下面我們通過一個很形象的日常生活示例,來說明外觀模式具體的應用場景。
我們可以想象這樣一個場景:下班回到家,你想看個電影,放鬆一下,但是你並沒有感覺到很開心。因為考慮到要拖地,而且家裡水壺還沒水了,你還要燒個熱水,還有自己找電影,想到這一切的一切,你突然放棄了想看電影的想法。
因為在正常情況下,每一步都要自己親自操作:首先先開啟家裡的掃地機器人(這已經算高端了),然後接水燒水,之後才能開啟電腦、找電影,整個過程操作完之後,你才能開始看電影,但是這時候你可能會感覺到更加疲憊。
但是假如,突然有一天你的生活開啟了外觀模式,那整個場景就完全不一樣了。這時候回到家,你只需要一鍵操作,掃地、燒水、找電影都可以一氣呵成,這樣你就可以直接看自己喜歡的電影了,豈不是美滋滋!
下面我們就來詳細看下這個一氣呵成的方法,具體如何用程式碼來實現:
掃地操作
正常情況下,你要自己用掃把掃地,如果是掃地機器人的話,你至少需要啟動下開關
public class Broom {
public void sweepFloor() {
System.out.println("掃帚正在掃地!");
}
}
燒水操作
燒水操作也一樣,你要用水壺接水,然後燒水
public class Kettle { public void boilWater() { System.out.println("燒水壺正在接水!"); System.out.println("燒水壺正在燒水!"); } }
搜尋電影操作
緊接著你還要自己搜尋電影,然後才能開始看電影
public class Computer {
public void searchVideo() {
System.out.println("電腦正在查詢電影!");
System.out.println("電腦查詢電影完成!");
}
}
外觀模式
但是如果你的生活啟用了外觀模式,僅需一鍵操作,就可以完成以上操作,同時開始看電影,感覺這個痛苦的過程一下就消失了呢,是不是一下就感覺美滋滋了呢!
public class SystemFacade {
Broom broom = new Broom();
Kettle kettle = new Kettle();
Computer computer = new Computer();
public void facade() {
broom.sweepFloor();
kettle.boilWater();
computer.searchVideo();
System.out.println("開始播放電影!");
}
}
測試程式碼
好了,下面就讓我們來一鍵操作吧!
@Test
public void testFacade() {
SystemFacade facade = new SystemFacade();
facade.facade();
}
然後我們就可以愉快地看電影了:
和介面卡比較
- 外觀模式不只是簡化了介面,也將客戶從元件的子系統中解耦
- 外觀模式和介面卡模式可以包裝許多類,但是外觀模式的意圖是簡化介面,而介面卡的意圖是將介面轉換成不同的介面
總結
從上面的示例程式碼,以及我們舉的生活中的例子,我們可以很清楚地看到,外觀模式本質上就是整合介面,為客戶端提供一個更簡潔的介面。現實生活中,外觀模式的例子還有很多,特別是在現在這種智慧時代,比如小愛同學、小度以及我們的手機智慧助手等,都是典型的外觀模式。從這一點上來講,人工智慧確實改變了我們的生活,讓生活的繁雜開始變得簡單,語音搜尋、語音控制各類電器……萬物互聯,真的是指日可待!
好了,關於外觀模式我們就說這麼多,總體來看這塊的內容也確實不過。