定义
又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
提供一个高层接口,让子系统容易使用
当子系统越来越复杂,可通过外观模式提供简单调用的接口
满足迪米特法原则,只需要知道最外层的接口如何使用即可,不用关心底层
Demo设计思路
假设有一个积分商城
子系统中
- 校验用户积分是否够支付商品
- 校验用户支付积分是否成功
- 返回物流号
在购买积分商品需要按顺序执行一个个子系统
如果直接把子系统接口向外提供就会有点麻烦
需要一个外观类把这些接口封装好
积分商品类
@Data
@AllArgsConstructor
public class PointGift {
private String name;
}
积分校验类
public class QualifyService {
public boolean isAvailable(PointGift gift) {
//校验积分是否足够
System.out.println("校验 " + gift.getName() + "积分资格通过");
return true;
}
}
积分支付类
public class PointsPaymentService {
public boolean pay(PointGift gift) {
//校验积分是否支付成功
System.out.println("支付 " + gift.getName() + " 积分成功");
return true;
}
}
物流类
public class ShippingService {
public String shipGift(PointGift gift) {
System.out.println(gift.getName() + " 进入物流系统");
//返回订单号
return "6666";
}
}
外观类
先校验积分是否足够,再支付积分,支付成功后开始走物流
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GiftExchangeService {
private QualifyService qualifyService;
private PointsPaymentService pointsPaymentService;
private ShippingService shippingService;
public void giftExchange(PointGift gift) {
if (qualifyService.isAvailable(gift)) {
//积分资格通过
if (pointsPaymentService.pay(gift)) {
//支付积分成功就开始走物流
String ship = shippingService.shipGift(gift);
System.out.println("积分购买成功,物流号为" + ship);
}
}
}
}
接口调用
public static void main(String[] args) {
PointGift gift = new PointGift("机械键盘");
QualifyService qualifyService = new QualifyService();
PointsPaymentService pointsPaymentService = new PointsPaymentService();
ShippingService shippingService = new ShippingService();
GiftExchangeService giftExchangeService = new GiftExchangeService(qualifyService, pointsPaymentService, shippingService);
giftExchangeService.giftExchange(gift);
}
demo比较简单,真实场景中各子系统都会执行复杂的逻辑,而外观模式对底层逻辑进行封装,对外就只需要提供这样的接口就行了