又叫門面模式,提供了一個統一的接口,用來訪問子系統中的一羣接口。定義了一個高層接口,讓子系統更容易使用。java
結構型設計模式
外觀模式與中介模式 ~ 外觀模式強調的是外界對子系統的交互。中介者模式強調的是子系統之間的交互。測試
外觀模式和單例模式 ~ 一般咱們會把外觀模式的外觀對象作成單例對象this
外觀模式和抽象工廠 ~ 咱們能夠經過抽象工廠來獲取子系統的實例,這樣子系統能夠經過外觀實例對外觀屏蔽。編碼
下面開始看代碼。在寫代碼以前咱們先假設一個應用場景,假設咱們有個積分商城,這個積分商城就包含如下幾個子系統。好比積分校驗,物流系統,積分支付子系統等子系統。spa
首先咱們建立一個禮物實體類。設計
public class PointsGift {
private String name;
public PointsGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
複製代碼
模擬一個積分校驗系統,看看用戶是否知足兌換資格。code
public class QualifyService {
public boolean isAvailable(PointsGift pointsGift){
System.out.println("校驗"+pointsGift.getName()+" 積分資格經過,庫存經過");
return true;
}
}
複製代碼
積分支付系統對象
public class PointsPaymentService {
public boolean pay(PointsGift pointsGift){
//扣減積分
System.out.println("支付"+pointsGift.getName()+" 積分紅功");
return true;
}
}
複製代碼
物流系統接口
public class ShippingService {
public String shipGift(PointsGift pointsGift){
//物流系統的對接邏輯
System.out.println(pointsGift.getName()+"進入物流系統");
String shippingOrderNo = "666";
return shippingOrderNo;
}
}
複製代碼
最後就是咱們本節的核心了,外觀類。
public class GiftExchangeService {
//這裏使用硬編碼,講道理的話應該是依賴注入。把服務注入進來
private QualifyService qualifyService = new QualifyService();
private PointsPaymentService pointsPaymentService = new PointsPaymentService();
private ShippingService shippingService = new ShippingService();
public void giftExchange(PointsGift pointsGift){
if(qualifyService.isAvailable(pointsGift)){
//資格校驗經過
if(pointsPaymentService.pay(pointsGift)){
//若是支付積分紅功
String shippingOrderNo = shippingService.shipGift(pointsGift);
System.out.println("物流系統下單成功,訂單號是:"+shippingOrderNo);
}
}
}
}
複製代碼
而後咱們來測試一下。
public class FacadeTest {
public static void main(String[] args) {
PointsGift pointsGift = new PointsGift("T恤");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.giftExchange(pointsGift);
}
}
複製代碼
咱們這裏的測試類只和外觀類交互,而後經過外觀類和各個子系統交互。外觀模式很簡單,就講到這裏。