Java設計模式之外觀模式
外觀模式也叫門面模式。
考慮這樣一個業務場景,商城裏面有積分兌換功能,比如1000積分可以兌換一個鍵盤等。這裏可以拆分出三個子系統, 積分數量和禮物庫存校驗子系統,積分支付子系統,物流子系統。
//創建積分禮物類
public class PointGift {
private String name;
public PointGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
//第一個子系統 校驗積分是否足夠,校驗庫存是否足夠
public class QualityService {
public boolean isAvailable(PointGift pointGift){
System.out.println(pointGift.getName()+" 積分滿足,庫存滿足!");
return true;
}
}
//第二個子系統,積分支付系統
public class PointPaymentService {
public boolean pay(PointGift pointGift){
System.out.println(pointGift.getName()+" 積分支付成功");
return true;
}
}
//第三個子系統,物流子系統
public class ShippingService {
public String shipGift(PointGift pointGift){
System.out.println(pointGift.getName()+"進入物流系統");
String shippingOrderNo="666";
return shippingOrderNo;
}
}
//外觀模式類,調用三個子系統
public class GiftExchangeService {
private QualityService qualityService=new QualityService();
private PointPaymentService paymentService=new PointPaymentService();
private ShippingService shippingService=new ShippingService();
public void giftExchange(PointGift pointGift){
//校驗積分數量和庫存
if (qualityService.isAvailable(pointGift)){
//積分支付是否成功
if (paymentService.pay(pointGift)){
String shippingOrderNo=shippingService.shipGift(pointGift);
System.out.println("物流系統下單成功,訂單號是:"+shippingOrderNo);
}
}
}
}
//應用層調用外觀模式類
public class Test {
public static void main(String[] a){
PointGift pointGift =new PointGift("鍵盤");
GiftExchangeService giftExchangeService=new GiftExchangeService();
giftExchangeService.giftExchange(pointGift);
}
}
//結果:
鍵盤 積分滿足,庫存滿足!
鍵盤 積分支付成功
鍵盤進入物流系統
物流系統下單成功,訂單號是:666
下面是UML的類圖,從類圖可以看出,應用層沒有直接調用三個子系統,應用層只關心積分兌換功能,不關心三個子系統的具體實現以及調用方法,而這些都被封裝在外觀模式類GiftExchangeService,應用層直接調用外觀模式類即可。與此同時,這也是遵循了迪米特法則,只需要知道該知道的。當然,如果需要新增子系統,就需要修改外觀模式類,這樣就違反了開閉原則。