-
定義
門面模式又叫外觀模式,它提供了一個同意的接口,用來對通路子系統中的多個接口。它的主要特性是定義了一個高層的接口,讓子系統更容易調用,是屬于一種結構型的設計模式。
-
代碼
1.通用的寫法,這裡建立三個子系統和和一個門面系統,門面系統提供三個方法分别調用子系統的方法。
public class SubSystemA {
public void doA(){
System.out.println("do a");
}
}
public class SubSystemB {
public void doB(){
System.out.println("do b");
}
}
public class SubSystemC {
public void doC(){
System.out.println("do c");
}
}
public class Facade {
private SubSystemA subSystemA = new SubSystemA();
private SubSystemB subSystemB = new SubSystemB();
private SubSystemC subSystemC = new SubSystemC();
public void doA(){
this.subSystemA.doA();
}
public void doB(){
this.subSystemB.doB();
}
public void doC(){
this.subSystemC.doC();
}
}
2. 寫一個測試類,建立門面系統,然後調用方法。
public class Test {
public static void main(String[] args) {
Facade facade = new Facade();
facade.doA();
facade.doB();
facade.doC();
}
}
3. 檢視結果。

4. 類的結構圖。
-
實際場景
比如模拟一個商品積分兌換的場景,兌換一個商品需要三個步驟:1.确認使用者的積分是否足夠。2.完成支付流程。3.進入物流。這裡就分别建立這三個系統(Service類),然後建立一個門面系統。然後在門面系統中分貝調用這三個子系統的服務。
1.建立商品類。
/**
* 訂單類
*/
public class Order {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.建立積分校驗系統。
/**
* 積分校驗系統
*/
public class QulifyService {
public boolean isAvilible(Order order) {
System.out.println("積分庫積分校驗通過,足夠兌換物品" + order.getName());
return true;
}
}
3.建立支付系統。
/**
* 支付系統
*/
public class PayService {
public boolean pay(Order order){
System.out.println("兌換商品" + order.getName() + "成功,積分已被扣除");
return true;
}
}
4.建立物流系統。
/**
* 物流系統
*/
public class DeliveryService {
public String delivery(Order order){
System.out.println("進入物流系統,商品已在快遞中...");
return "666";
}
}
5.建立門面系統。
public class OrderFacadeService {
private QulifyService qulifyService = new QulifyService();
private PayService payService = new PayService();
private DeliveryService deliveryService = new DeliveryService();
public void exchange(Order order) {
if (qulifyService.isAvilible(order)) {
if (payService.pay(order)) {
String deliveryNo = deliveryService.delivery(order);
System.out.println("下單成功,物流單号為:" + deliveryNo);
}
}
}
}
6.測試調用。
public class Test {
public static void main(String[] args) {
Order order = new Order();
order.setName("《Java 技術核心卷2》");
OrderFacadeService orderFacadeService = new OrderFacadeService();
orderFacadeService.exchange(order);
}
}
7.檢視結果。
-
總結
1.門面模式的優點:
(1)簡化了調用的過程,無需深入的了解子系統,以防給子系統帶來風險。
(2)減少系統依賴,降低耦合。
(3)更好的劃分了通路的層次,提高了安全性。
(4)遵循迪米特法則,即最少知道原則。
2.門面模式的缺點:
(1)當子系統的功能需要擴充時,門面系統也需要進行擴充。容易帶來未知的風險。
(2)不符合開閉原則。
(3)某些情況下可能違背單一職責原則。