一,定义与类型
提供了一个统一的接口,用来访问子系统中的一群接口
定义了一个高层接口,让子系统更容易使用
类型:结构型
二,适用场景
1.子系统越来越复杂,增加外观模式提供简单的调用接口
2.构建多层系统结构,利用外观对象作为每层的入口,简化层间调用
三,优点:
1.简化了调用过程,无需了解深入子系统,防止带来风险
2.减少系统依赖,松散耦合
3.更好划分访问层次
四,缺点:
1.增加子系统,扩展子系统行为容易引入风险
2.不符合开闭原则
五,代码演练
模拟积分兑换礼品
1.PointsGift
public class PointsGift {
private String name;
public PointsGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
2.QualifyService
public class QualifyService {
public boolean isAvailable(PointsGift pointsGift){
System.out.println("校验"+pointsGift.getName()+"积分校验资格通过");
return true;
}
}
3.PointsPaymentService
public class PointsPaymentService {
public boolean pay( PointsGift pointsGift){
//扣减积分
System.out.println("支付"+pointsGift.getName()+"积分成功");
return true;
}
}
4.ShippingService
public class ShippingService {
public String shipGift(PointsGift pointsGift){
//物流系统的对接逻辑
System.out.println(pointsGift.getName()+"进入物流系统");
String shippingNo="666";
return shippingNo;
}
}
5.GiftChangeService
public class GiftChangeService {
private PointsPaymentService pointsPaymentService=new PointsPaymentService();
private ShippingService shippingService=new ShippingService();
private QualifyService qualifyService=new QualifyService();
public void giftChange(PointsGift pointsGift){
if(qualifyService.isAvailable(pointsGift)){
//资格校验通过
if(pointsPaymentService.pay(pointsGift)){
//如果支付积分成功
String shippingOrderNo=shippingService.shipGift(pointsGift);
System.out.println("物流系统下单成功"+shippingOrderNo);
}
}
}
}
6.Test
public class Test {
public static void main(String[] args) {
PointsGift pointsGift=new PointsGift("短裤");
GiftChangeService giftChangeService=new GiftChangeService();
giftChangeService.giftChange(pointsGift);
}
}
UML类图
应用层不与子系统发生交互
六,源码
Spring的JdbcUtil
tomcat的RequestFacade