外觀模式
定義
又叫門面模式,提供了一個(gè)統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。定義了一個(gè)高層接口,讓子系統(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)險(xiǎn)。
- 減少系統(tǒng)的依賴、松散耦合
- 更好的劃分訪問層次
- 符合迪米特法則,即最少知道原則。
缺點(diǎn)
- 增加子系統(tǒng)、擴(kuò)展子系統(tǒng)行為容易引入風(fēng)險(xiǎn)
- 增加子系統(tǒng)的時(shí)候不符合開閉原則
相關(guān)設(shè)計(jì)模式
外觀模式與中介模式
~ 外觀模式強(qiáng)調(diào)的是外界對子系統(tǒng)的交互。中介者模式強(qiáng)調(diào)的是子系統(tǒng)之間的交互。
外觀模式和單例模式
~ 通常我們會把外觀模式的外觀對象做成單例對象
外觀模式和抽象工廠
~ 我們可以通過抽象工廠來獲取子系統(tǒng)的實(shí)例,這樣子系統(tǒng)可以通過外觀實(shí)例對外觀屏蔽。
下面開始看代碼。在寫代碼之前我們先假設(shè)一個(gè)應(yīng)用場景,假設(shè)我們有個(gè)積分商城,這個(gè)積分商城就包含以下幾個(gè)子系統(tǒng)。比如積分校驗(yàn),物流系統(tǒng),積分支付子系統(tǒng)等子系統(tǒng)。
首先我們創(chuàng)建一個(gè)禮物實(shí)體類。
public class PointsGift {
private String name;
public PointsGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
模擬一個(gè)積分校驗(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);
}
}
我們這里的測試類只和外觀類交互,然后通過外觀類和各個(gè)子系統(tǒng)交互。外觀模式很簡單,就講到這里。