外觀模式
定義
又叫門面模式,提供了一個統(tǒng)一的接口抡谐,用來訪問子系統(tǒng)中的一群接口。定義了一個高層接口桐猬,讓子系統(tǒng)更容易使用麦撵。
類型
結(jié)構(gòu)型
使用場景
- 子系統(tǒng)越來越復(fù)雜,增加外觀模式提供的簡單調(diào)用接口
- 構(gòu)建多層系統(tǒng)結(jié)構(gòu)溃肪,利用外觀對象作為每層的入口免胃,簡化層間調(diào)用。
優(yōu)點(diǎn)
- 簡化了調(diào)用過程惫撰,無需了解深入子系統(tǒng)羔沙,防止來風(fēng)險。
- 減少系統(tǒng)的依賴厨钻、松散耦合
- 更好的劃分訪問層次
- 符合迪米特法則扼雏,即最少知道原則。
缺點(diǎn)
- 增加子系統(tǒng)莉撇、擴(kuò)展子系統(tǒng)行為容易引入風(fēng)險
- 增加子系統(tǒng)的時候不符合開閉原則
相關(guān)設(shè)計模式
外觀模式與中介模式
~ 外觀模式強(qiáng)調(diào)的是外界對子系統(tǒng)的交互呢蛤。中介者模式強(qiáng)調(diào)的是子系統(tǒng)之間的交互。
外觀模式和單例模式
~ 通常我們會把外觀模式的外觀對象做成單例對象
外觀模式和抽象工廠
~ 我們可以通過抽象工廠來獲取子系統(tǒng)的實(shí)例棍郎,這樣子系統(tǒng)可以通過外觀實(shí)例對外觀屏蔽其障。
下面開始看代碼。在寫代碼之前我們先假設(shè)一個應(yīng)用場景涂佃,假設(shè)我們有個積分商城励翼,這個積分商城就包含以下幾個子系統(tǒng)蜈敢。比如積分校驗(yàn),物流系統(tǒng)汽抚,積分支付子系統(tǒng)等子系統(tǒng)抓狭。
首先我們創(chuàng)建一個禮物實(shí)體類。
public class PointsGift {
private String name;
public PointsGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
模擬一個積分校驗(yàn)系統(tǒng)造烁,看看用戶是否滿足兌換資格否过。
public class QualifyService {
public boolean isAvailable(PointsGift pointsGift){
System.out.println("校驗(yàn)"+pointsGift.getName()+" 積分資格通過,庫存通過");
return true;
}
}
積分支付系統(tǒng)
public class PointsPaymentService {
public boolean pay(PointsGift pointsGift){
//扣減積分
System.out.println("支付"+pointsGift.getName()+" 積分成功");
return true;
}
}
物流系統(tǒng)
public class ShippingService {
public String shipGift(PointsGift pointsGift){
//物流系統(tǒng)的對接邏輯
System.out.println(pointsGift.getName()+"進(jìn)入物流系統(tǒng)");
String shippingOrderNo = "666";
return shippingOrderNo;
}
}
最后就是我們本節(jié)的核心了,外觀類惭蟋。
public class GiftExchangeService {
//這里使用硬編碼苗桂,講道理的話應(yīng)該是依賴注入。把服務(wù)注入進(jìn)來
private QualifyService qualifyService = new QualifyService();
private PointsPaymentService pointsPaymentService = new PointsPaymentService();
private ShippingService shippingService = new ShippingService();
public void giftExchange(PointsGift pointsGift){
if(qualifyService.isAvailable(pointsGift)){
//資格校驗(yàn)通過
if(pointsPaymentService.pay(pointsGift)){
//如果支付積分成功
String shippingOrderNo = shippingService.shipGift(pointsGift);
System.out.println("物流系統(tǒng)下單成功,訂單號是:"+shippingOrderNo);
}
}
}
}
然后我們來測試一下告组。
public class FacadeTest {
public static void main(String[] args) {
PointsGift pointsGift = new PointsGift("T恤");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.giftExchange(pointsGift);
}
}
我們這里的測試類只和外觀類交互煤伟,然后通過外觀類和各個子系統(tǒng)交互。外觀模式很簡單木缝,就講到這里便锨。