目錄
一、基礎簡介
1、定義
爲子系統中的一組接口提供一個一致的界面;
定義一個高層接口,使得這一子系統更加容易使用
2、使用場景
- 1、爲複雜的模塊或子系統提供外界訪問的模塊。
- 2、降低訪問複雜系統的內部子系統時的複雜度,簡化客戶端與之的接口。
3、優缺點
外觀(Facade)模式是“迪米特法則”的典型應用,它有以下主要優點。
- 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
- 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,並使得子系統使用起來更加容易。
- 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因爲編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。
外觀(Facade)模式的主要缺點如下。
- 不能很好地限制客戶使用子系統類。
- 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
4、結構圖
外觀(Facade)模式包含以下主要角色。
- 外觀(Facade)角色:爲多個子系統對外提供一個共同的接口。
- 子系統(Sub System)角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。
- 客戶(Client)角色:通過一個外觀角色訪問各個子系統的功能。
二、“買房”的外觀模式實例
1、“買房”的過程圖
在買房的過程中,客戶的操作是比較繁瑣的,這個時候找到Facade外觀類(也就是現實生活中的中介),就可以簡單的搞定
2、SubSystem 子系統角色
package com.mfc.design.外觀模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem01_SelectRoom {
public void selectRoom(){
System.out.println("客戶選擇好了房源");
}
}
package com.mfc.design.外觀模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem02_Sign {
public void sign(){
System.out.println("簽訂購房合同");
}
}
package com.mfc.design.外觀模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem03_Procedure {
public void procedure(){
System.out.println("辦理一系列手續");
}
}
package com.mfc.design.外觀模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem04_Tollage {
public void tollage(){
System.out.println("交稅");
}
}
package com.mfc.design.外觀模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:21
*/
public class SubSystem05_Credential {
public void credential(){
System.out.println("拿到房產證");
}
}
3、Facade
package com.mfc.design.外觀模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:37
*/
public class Facade_BuyRoom {
private SubSystem01_SelectRoom selectRoom;
private SubSystem02_Sign sign;
private SubSystem03_Procedure procedure;
private SubSystem04_Tollage tollage;
private SubSystem05_Credential credential;
// 需要知道子系統的細節
public Facade_BuyRoom() {
selectRoom = new SubSystem01_SelectRoom();
sign = new SubSystem02_Sign();
procedure = new SubSystem03_Procedure();
tollage = new SubSystem04_Tollage();
credential = new SubSystem05_Credential();
}
public void buyRoom(){
System.out.println("買房開始");
selectRoom.selectRoom();
sign.sign();
procedure.procedure();
tollage.tollage();
credential.credential();
System.out.println("買房結束");
}
}
4、Client_Facade
package com.mfc.design.外觀模式;
/**
* @author MouFangCai
* @date 2019/10/14 15:46
*/
public class Client_Facade {
public static void main(String[] args) {
Facade_BuyRoom facade_buyRoom = new Facade_BuyRoom();
facade_buyRoom.buyRoom();
}
}
5、結果
買房開始
客戶選擇好了房源
簽訂購房合同
辦理一系列手續
交稅
拿到房產證
買房結束Process finished with exit code 0