java設計模式精講 Debug 方式+記憶體分析 第10章 外觀模式
阿新 • • 發佈:2018-12-05
外觀模式
10-1 外觀模式講解
11-2 裝飾者模式coding
有一個積分禮物類:
/** 積分禮物 */
public class PointsGift {
private String name;
public PointsGift(String name) {
this .name = name;
}
public String getName() {
return name;
}
}
校驗類:是否有資格
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;
private PointsPaymentService pointsPaymentService;
private ShippingService shippingService;
public void setQualifyService(QualifyService qualifyService) {
this.qualifyService = qualifyService;
}
public void setPointsPaymentService(PointsPaymentService pointsPaymentService) {
this.pointsPaymentService = pointsPaymentService;
}
public void setShippingService(ShippingService shippingService) {
this.shippingService = 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 Test {
public static void main(String[]args){
PointsGift pointsGift = new PointsGift("T恤");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.setQualifyService(new QualifyService());
giftExchangeService.setPointsPaymentService(new PointsPaymentService());
giftExchangeService.setShippingService(new ShippingService());
giftExchangeService.giftExchange(pointsGift);
}
}
執行結果:
校驗T恤積分資格通過,庫存通過
支付T恤 積分成功
T恤進入物流系統
物流訂單系統下單成功,訂單號是:666
這個就是現在的類圖:
這裡和子系統有關聯關係是因為沒有整合Spring,我們可以模擬一下,在外觀類裡面直接new出例項:
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 Test {
public static void main(String[]args){
PointsGift pointsGift = new PointsGift("T恤");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.giftExchange(pointsGift);
}
}
這個時候的類圖就這樣的:
我們還可以用抽象外觀類來實現;