開局一張圖,剩下全靠寫...
外觀模式是什麼
外觀模式,其實是用來隱藏系統的複雜性的,遮蔽掉了背後複雜的邏輯,向使用者提供簡單的可以訪問系統的介面,也是屬於結構型模式的一種 。
舉個例子,比如我們的Java
三層MVC
架構,對外提供的是controller
,但是controller
內部可能呼叫了很多service
,service
又呼叫了一些mapper
,反正就是內部很複雜,但是對外只是一個介面,一個門面,外部看起來是簡單的,外觀很好看,實際上,你都懂。
再舉個例子,我們用的電腦,其實內部也是極其複雜的,但是我們操作的時候,已經不管記憶體,cpu,磁碟,顯示卡這些怎麼工作了,甚至更加底層還有二進位制,硬體之類的,我們只需要開機,做我們想做的事情,比如Ctrl+C
,Ctrl+V
,在美麗漂亮的介面上操作就可以了。
外觀模式的角色
外觀模式主要包括幾個角色:
- 外觀角色:糅合多個子系統功能,對外提供一個共同的介面
- 子系統的角色:實現系統的部分功能
- 客戶角色:通過外觀角色訪問各個子系統的功能
優點與缺點
優點:
- 減少系統依賴,這裡指的是對外的系統依賴
- 提高靈活性
- 提高安全性
缺點:
- 把東西糅合到一個人身上,帶來未知的風險
- 增加新的子系統可能需要修改外觀類或者客戶端的原始碼,違反了“開閉原則”
測試例子
我們以電腦為例子,先給電腦的每個部件抽象定義成為一個元件,賦予一個work()
的方法:
public interface Component {
public void work();
}
再定義記憶體,磁碟,cpu三種不同元件,分別實現上面的介面,各自工作:
public class Disk implements Component{
@Override
public void work() {
System.out.println("磁碟工作了...");
}
}
public class CPU implements Component{
@Override
public void work() {
System.out.println("CPU工作了...");
}
}
public class Memory implements Component{
@Override
public void work() {
System.out.println("記憶體工作了...");
}
}
然後以上元件可能是交叉在一起工作的,我們模擬一下開機過程,作業系統分別呼叫他們:
public class OperationSystem {
private Component disk;
private Component memory;
private Component CPU;
public OperationSystem() {
this.disk = new Disk();
this.memory = new Memory();
this.CPU = new CPU();
}
public void startingUp(){
System.out.println("準備開機...");
disk.work();
memory.work();
CPU.work();
}
}
而使用人呼叫的其實是作業系統的開機啟動方法,不會直接呼叫到內部的方法,也就是遮蔽掉了所有的細節:
public class PersonTest {
public static void main(String[] args) {
OperationSystem operationSystem = new OperationSystem();
operationSystem.startingUp();
}
}
執行結果如下:
準備開機...
磁碟工作了...
記憶體工作了...
CPU工作了...
最後簡單小結一下,外觀模式,可以成為門面模式,也就是遮蔽掉內部細節,只對外提供介面,實現所需的功能,內部功能可能很複雜,以上我們模擬的只是簡單操作。學會了麼?
【作者簡介】:
秦懷,公眾號【秦懷雜貨店】作者,個人網站:http://aphysia.cn,技術之路不在一時,山高水長,縱使緩慢,馳而不息。