一,概念介紹
外觀模式(Facade),他隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。
二,程式碼實現
直接上程式碼吧,邊看程式碼遍理解概念,我覺得這樣效果也不錯,
第一步:先定義系統A、系統B、系統C這三個類,
package test; /** * A系統 * @author ningbeibei * */ public class SystemA { //A系統方法 public void functionA() { System.out.println("我是系統A..."); } }
package test; /** * B系統 * @author ningbeibei * */ public class SystemB { //B系統方法 public void functionB() { System.out.println("我是系統B..."); }
package test; /** * C系統 * @author ningbeibei * */ public class SystemC { //C系統方法 public void functionC() { System.out.println("我是系統C..."); } }
第二步:定義一個高層介面,分別宣告呼叫三個子系統得方法
package test; /** * 定義一個更高層得介面,使其實現類實現所有方法 * @author ningbeibei * */ public interface Facade { //方法A void methodA(); //方法B void methodB(); //方法C void methodC(); }
第三步:實現定義得高層介面,並且持有子系統物件引用
package test; /** * 實現我們剛才定義得高層介面中得方法 * @author ningbeibei * */ public class FacadeImpl implements Facade { //這個系統需要實現類中持有他得引用。 private SystemA systema; private SystemB systemb; private SystemC systemc; /** * 重寫實現類構造方法,初始化這個三個類得物件 */ FacadeImpl(){ systema = new SystemA(); systemb = new SystemB(); systemc = new SystemC(); } //呼叫A系統方法 @Override public void methodA() { systema.functionA(); } //呼叫B系統方法 @Override public void methodB() { systemb.functionB(); } //呼叫B系統方法 @Override public void methodC() { systemc.functionC(); } }
第四步:測試類編寫
package test; /** * 測試類 * @author ningbeibei * */ public class test1 { //測試方法 public static void main(String[] args) { /**客戶端在呼叫這個三個系統時只需要通過Facade * 這個介面就可以訪問各個系統得方法*/ Facade fac = new FacadeImpl(); fac.methodA(); fac.methodB(); fac.methodC(); } }
執行結果
三、優點
- 鬆散耦合
使得客戶端和子系統之間解耦,讓子系統內部的模組功能更容易擴充套件和維護;
- 簡單易用
客戶端根本不需要知道子系統內部的實現,或者根本不需要知道子系統內部的構成,它只需要跟Facade類互動即可。
- 更好的劃分訪問層次
有些方法是對系統外的,有些方法是系統內部相互互動的使用的。子系統把那些暴露給外部的功能集中到門面中,這樣就可以實現客戶端的使用,很好的隱藏了子系統內部的細節。
四、我寫得不足之處望各位批評指正