外观模式
1.基础知识
定义∶
又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
外观模式定义了一个高层接口,让子系统更容易使用
类型∶结构型
相当于系统是一个黑箱,用户不需要关心内部的具体流程,达到用户目的即可!
spring中controller层的概念就算是外观模式了,调用一个方法返回数据,但是并不关心内部的具体流程
应用层只和主系统交互,和子系统没有联系
适用场景
子系统越来越复杂,增加外观模式提供简单调用接口
构建多层系统结构,利用外观对象作为每层的入口,简化层间调用
优点
简化了调用过程,无需了解深入子系统,防止带来风险。
减少系统依赖、松散耦合
更好的划分访问层次
符合迪米特法则,即最少知道原则
缺点
增加子系统、扩展子系统行为容易引入风险
不符合开闭原则
相关设计模式
外观模式和中介者模式
外观模式和单例模式
外观模式和抽象工厂模式
2.实战
这里假设一个在KFC中用积分兑换奥尔良鸡腿堡的业务场景
1.校验用户可用积分是否大于兑换积分?
2.积分支付成功 保存支付记录
3.生成对应的取餐码 ,将取餐码推送给用户
UML图如下:注意外观模式,test只会调用主系统即GiftExchangeService
/**
* @Author LYS
* @Date 2022/1/18 20:44
* @Version 1.0
*/
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);
}
}
}
}
/**
* @Author LYS
* @Date 2022/1/18 20:43
* @Version 1.0
*/
public class PointsGift {
private String name;
public PointsGift(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/**
* @Author LYS
* @Date 2022/1/18 20:44
* @Version 1.0
*/
public class PointsPaymentService {
public boolean pay(PointsGift pointsGift) {
//扣减积分,保存支付记录
System.out.println("支付" + pointsGift.getName() + " 积分成功!保存支付记录");
return true;
}
}
/**
* @Author LYS
* @Date 2022/1/18 20:44
* @Version 1.0
*/
public class QualifyService {
public boolean isAvailable(PointsGift pointsGift) {
System.out.println("校验" + pointsGift.getName() + " 积分资格通过,用户可支付积分大于商品积分");
return true;
}
}
/**
* @Author LYS
* @Date 2022/1/18 20:44
* @Version 1.0
*/
public class ShippingService {
public String shipGift(PointsGift pointsGift) {
//生成对应的取餐码 ,将取餐码推送给用户
System.out.println(pointsGift.getName() + "生成对应的取餐码 ,将取餐码推送给用户");
String shippingOrderNo = "054";
return shippingOrderNo;
}
}
/**
* @Author LYS
* @Date 2022/1/18 20:45
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
PointsGift pointsGift = new PointsGift("奥尔良鸡腿堡");
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.giftExchange(pointsGift);
}
}
3.源码
以facade结尾的类就是外观模式
spring JdbcUtils
public abstract class JdbcUtils {
一系列对链接的操作: