設計模式【9】-- 外觀模式?沒那麼高大上

秦懷雜貨店 2022-01-07 08:50:32 阅读数:749

模式 模式 高大

1

開局一張圖,剩下全靠寫...

外觀模式是什麼

外觀模式,其實是用來隱藏系統的複雜性的,屏蔽掉了背後複雜的邏輯,向用戶提供簡單的可以訪問系統的接口,也是屬於結構型模式的一種 。

舉個例子,比如我們的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,技術之路不在一時,山高水長,縱使緩慢,馳而不息。

劍指Offer全部題解PDF

開源編程筆記

版权声明:本文为[秦懷雜貨店]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201070850322764.html