定义

又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
提供一个高层接口,让子系统容易使用

当子系统越来越复杂,可通过外观模式提供简单调用的接口
满足迪米特法原则,只需要知道最外层的接口如何使用即可,不用关心底层

Demo设计思路

假设有一个积分商城
子系统中

  • 校验用户积分是否够支付商品
  • 校验用户支付积分是否成功
  • 返回物流号

在购买积分商品需要按顺序执行一个个子系统
如果直接把子系统接口向外提供就会有点麻烦
需要一个外观类把这些接口封装好

积分商品类

  1. @Data
  2. @AllArgsConstructor
  3. public class PointGift {
  4. private String name;
  5. }

积分校验类

  1. public class QualifyService {
  2. public boolean isAvailable(PointGift gift) {
  3. //校验积分是否足够
  4. System.out.println("校验 " + gift.getName() + "积分资格通过");
  5. return true;
  6. }
  7. }

积分支付类

  1. public class PointsPaymentService {
  2. public boolean pay(PointGift gift) {
  3. //校验积分是否支付成功
  4. System.out.println("支付 " + gift.getName() + " 积分成功");
  5. return true;
  6. }
  7. }

物流类

  1. public class ShippingService {
  2. public String shipGift(PointGift gift) {
  3. System.out.println(gift.getName() + " 进入物流系统");
  4. //返回订单号
  5. return "6666";
  6. }
  7. }

外观类

先校验积分是否足够,再支付积分,支付成功后开始走物流

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class GiftExchangeService {
  5. private QualifyService qualifyService;
  6. private PointsPaymentService pointsPaymentService;
  7. private ShippingService shippingService;
  8. public void giftExchange(PointGift gift) {
  9. if (qualifyService.isAvailable(gift)) {
  10. //积分资格通过
  11. if (pointsPaymentService.pay(gift)) {
  12. //支付积分成功就开始走物流
  13. String ship = shippingService.shipGift(gift);
  14. System.out.println("积分购买成功,物流号为" + ship);
  15. }
  16. }
  17. }
  18. }

接口调用

  1. public static void main(String[] args) {
  2. PointGift gift = new PointGift("机械键盘");
  3. QualifyService qualifyService = new QualifyService();
  4. PointsPaymentService pointsPaymentService = new PointsPaymentService();
  5. ShippingService shippingService = new ShippingService();
  6. GiftExchangeService giftExchangeService = new GiftExchangeService(qualifyService, pointsPaymentService, shippingService);
  7. giftExchangeService.giftExchange(gift);
  8. }

image.png
demo比较简单,真实场景中各子系统都会执行复杂的逻辑,而外观模式对底层逻辑进行封装,对外就只需要提供这样的接口就行了