Facade模式也叫外觀模式,是由GoF提出的23種設計模式中的一種。Facade模式為一組具有類似功能的類群,比如類庫,子系統等等,提供一個一致的簡單的界面。這個一致的簡單的界面被稱作facade。 外觀模式的角色和職責 1、Facade:為調用方定義簡單的調用介面。 2、Clients:調用者。 ...
Facade模式也叫外觀模式,是由GoF提出的23種設計模式中的一種。Facade模式為一組具有類似功能的類群,比如類庫,子系統等等,提供一個一致的簡單的界面。這個一致的簡單的界面被稱作facade。
外觀模式的角色和職責
1、Facade:為調用方定義簡單的調用介面。
2、Clients:調用者。通過Facade介面調用提供某功能的內部類群。
3、Packages:功能提供者。指提供功能的類群(模塊或子系統)。
使用場景
在以下情況下可以考慮使用外觀模式: (1)設計初期階段,應該有意識的將不同層分離,層與層之間建立外觀模式。 (2) 開發階段,子系統越來越複雜,增加外觀模式提供一個簡單的調用介面。 (3) 維護一個大型遺留系統的時候,可能這個系統已經非常難以維護和擴展,但又包含非常重要的功能,為其開發一個外觀類,以便新系統與其交互。 簡單來說,使用了外觀模式,用戶就不必直接面對眾多功能模塊,降低了使用難度,簡單舉個例子 電腦開機進入系統,我們把他分為4步,首先打開電源,bois自檢,系統引導,進入系統,4個功能是四個功能模塊 打開電源1 public class StartPower { 2 /* 3 * 打開電源 4 */ 5 public void startPower(){ 6 System.out.println("電腦通電"); 7 } 8 }
bois自檢
1 public class BoisSelfTest { 2 /* 3 * bios自檢 4 */ 5 public void boisSelfTest(){ 6 System.out.println("bios自檢"); 7 } 8 }
系統引導
1 public class SystemGuide { 2 /* 3 * 系統引導 4 */ 5 public void systemGuide(){ 6 System.out.println("系統引導"); 7 } 8 }
進入系統
1 public class EnterSystem { 2 /* 3 * 進入系統 4 */ 5 public void enterSystem(){ 6 System.out.println("進入系統"); 7 } 8 }
如果,我們沒有使用外觀模式,就需要用戶自己挨個使用這些功能
1 public class MainClass { 2 public static void main(String[] args) { 3 StartPower startPower = new StartPower(); 4 startPower.startPower(); 5 6 BoisSelfTest boisSelfTest = new BoisSelfTest(); 7 boisSelfTest.boisSelfTest(); 8 9 SystemGuide systemGuide = new SystemGuide(); 10 systemGuide.systemGuide(); 11 12 EnterSystem enterSystem = new EnterSystem(); 13 enterSystem.enterSystem(); 14 } 15 }
運行結果為:
這樣,電腦順利啟動,可是同樣可以看出來,用戶使用非常繁瑣,不僅需要用戶自己挨個使用所有用到的功能,同時還需要用戶知道電腦啟動的順序,按順序使用功能,不然就會導致問題,這樣顯然是不可取的
所以,用到外觀模式,創建一個Facade,專門用於使用功能模塊
1 public class Facade { 2 private StartPower startPower = null; 3 private BoisSelfTest boisSelfTest = null; 4 private SystemGuide systemGuide = null; 5 private EnterSystem enterSystem = null; 6 7 public void startComputer(){ 8 startPower = new StartPower(); 9 boisSelfTest = new BoisSelfTest(); 10 systemGuide = new SystemGuide(); 11 enterSystem = new EnterSystem(); 12 13 startPower.startPower(); 14 boisSelfTest.boisSelfTest(); 15 systemGuide.systemGuide(); 16 enterSystem.enterSystem(); 17 } 18 }
這時客戶端就是這樣
1 public class MainClass { 2 public static void main(String[] args) { 3 Facade computer = new Facade(); 4 computer.startComputer(); 5 } 6 }
可以看到,用戶這時只需要調用Facade中的方法即可,無需知道電腦有什麼具體的功能模塊,無需知道功能模塊執行的順序是什麼,只是調用一下就好了。
簡化了使用,同時也增加了代碼的復用與可維護性。
優點
1、鬆散耦合:使得客戶端和子系統之間解耦,讓子系統內部的模塊功能更容易擴展和維護;
2、簡單易用:客戶端根本不需要知道子系統內部的實現,或者根本不需要知道子系統內部的構成,它只需要跟Facade類交互即可。
3、更好的劃分訪問層次:有些方法是對系統外的,有些方法是系統內部相互交互的使用的。子系統把那些暴露給外部的功能集中到門面中,這樣就可以實現客戶端的使用,很好的隱藏了子系統內部的細節。