设计模式之外观模式

一、什么是外观模式

外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式,也叫门面模式,属于结构型设计模式。

二、外观模式类图

设计模式之外观模式插图

三、外观模式角色

  • 外观角色(Facade): 客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任,并将客户端的请求委派到相应的子系统对象。
  • 子系统角色(SubSystem): 子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是单独的类,而是一个类的集合,子系统并不知道门面的存在。对于子系统而言,门面仅仅是一个客户端而已。

四、外观模式优缺点

优点:

  1. 简化了调用复杂度,客户端无需了解子系统。
  2. 减少子系统依赖、松散耦合,让子系统内部的模块能更容易扩展和维护。
  3. 客户端调用统一调用门面,层次清晰,简单易用。符合迪米特法则。

缺点:

  1. 增加子系统、扩展子系统行为容易引入风险。
  2. 不符合OCP(对修改关闭,对扩展开放)原则。

五、外观模式demo示例

1、Demo需求

提供一个门面类,实现支付模块各支付渠道(支付宝、微信支付、云闪付)支付方法,供客户端调用。客户端省去了构建支付参数及调用支付api的复杂工作。

2、接口定义

/**
  * @Description: 支付模块:支付接口api
  **/ public interface IPayment {

     /**
      * 设置支付参数
      */     void setPayParams();
 
     /**
      * 支付功能
      */     void pay();

 }

3、实现类定义

/**
  * @Description: 子模块角色:支付宝支付api
  **/ public class AliPayment implements IPayment {

     @Override
     public void setPayParams() {
         System.out.println("设置支付宝支付参数");
     }
 
     @Override
     public void pay() {
         System.out.println("正在调用支付宝支付api...");
     }

 }
/**
  * @Description: 子模块角色:微信支付api
  **/ public class WeixinPayment implements IPayment {

     @Override
     public void setPayParams() {
         System.out.println("设置微信支付参数");
     }
 
     @Override
     public void pay() {
         System.out.println("正在调用微信支付api...");
     }

 }
/**
  * @Description: 子模块角色:银联云闪付api
  **/ public class YunshanPayment implements IPayment {

     @Override
     public void setPayParams() {
         System.out.println("设置云闪付支付参数");
     }
 
     @Override
     public void pay() {
         System.out.println("正在调用云闪付支付api...");
     }

 }

4、支付模块门面类

/**
  * @Description: 门面角色:支付模块门面类
  **/ public class PaymentFacade {

     // 支付宝api
     private AliPayment aliPayment;
     // 微信api
     private WeixinPayment weixinPayment;
     // 云闪付api
     private YunshanPayment yunshanPayment;
 
     /**
      * 初始化
      */     public PaymentFacade() {
         aliPayment = new AliPayment();
         weixinPayment = new WeixinPayment();
         yunshanPayment = new YunshanPayment();
     }
 
     /**
      * 支付宝支付通道
      */     public void aliPay() {
         aliPayment.setPayParams();
         aliPayment.pay();
     }
 
     /**
      * 微信支付通道
      */     public void weixinPay() {
         weixinPayment.setPayParams();
         weixinPayment.pay();
     }
 
     /**
      * 云闪付支付通道
      */     public void yunshanPay() {
         yunshanPayment.setPayParams();
         yunshanPayment.pay();
     }

 }

5、测试

/**
  * @Description: 外观模式客户端测试
  **/ public class FacadeClient {
 
     public static void main(String[] args) {
         // 1.创建门面类对象:支付api门面
         PaymentFacade paymentFacade = new PaymentFacade();
 
         // 2.使用微信支付
         paymentFacade.weixinPay();
         System.out.println("=============================");
         // 3.使用支付宝支付
         paymentFacade.aliPay();
         System.out.println("=============================");
         // 3.使用云闪付支付
         paymentFacade.yunshanPay();
         System.out.println("=============================");
     }
 }
设置微信支付参数
正在调用微信支付api...
=============================
设置支付宝支付参数
正在调用支付宝支付api...
=============================
设置云闪付支付参数
正在调用云闪付支付api...
=============================

发表评论