定义
又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
提供一个高层接口,让子系统容易使用
当子系统越来越复杂,可通过外观模式提供简单调用的接口
满足迪米特法原则,只需要知道最外层的接口如何使用即可,不用关心底层
Demo设计思路
假设有一个积分商城
子系统中
- 校验用户积分是否够支付商品
- 校验用户支付积分是否成功
- 返回物流号
在购买积分商品需要按顺序执行一个个子系统
如果直接把子系统接口向外提供就会有点麻烦
需要一个外观类把这些接口封装好
积分商品类
@Data@AllArgsConstructorpublic 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@NoArgsConstructorpublic 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比较简单,真实场景中各子系统都会执行复杂的逻辑,而外观模式对底层逻辑进行封装,对外就只需要提供这样的接口就行了
