文章内容
一、什么是外观模式
外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式,也叫门面模式,属于结构型设计模式。
二、外观模式类图

三、外观模式角色
- 外观角色(Facade): 客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任,并将客户端的请求委派到相应的子系统对象。
- 子系统角色(SubSystem): 子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是单独的类,而是一个类的集合,子系统并不知道门面的存在。对于子系统而言,门面仅仅是一个客户端而已。
四、外观模式优缺点
1、优点
- 简化了调用复杂度,客户端无需了解子系统。
- 减少子系统依赖、松散耦合,让子系统内部的模块能更容易扩展和维护。
- 客户端调用统一调用门面,层次清晰,简单易用。符合迪米特法则。
2、缺点
- 增加子系统、扩展子系统行为容易引入风险。
- 不符合OCP(对修改关闭,对扩展开放)原则。
五、外观模式demo示例
1、Demo需求
提供一个门面类,实现支付模块各支付渠道(支付宝、微信支付、云闪付)支付方法,供客户端调用。客户端省去了构建支付参数及调用支付api的复杂工作。
2、接口定义
01 02 03 04 05 06 07 08 09 10 11 12 13 | /** * @Description: 支付模块:支付接口api **/ public interface IPayment { /** * 设置支付参数 */ void setPayParams(); /** * 支付功能 */ void pay(); } |
3、实现类定义
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | /** * @Description: 子模块角色:支付宝支付api **/ public class AliPayment implements IPayment { @Override public void setPayParams() { System.out.println( "设置支付宝支付参数" ); } @Override public void pay() { System.out.println( "正在调用支付宝支付api..." ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | /** * @Description: 子模块角色:微信支付api **/ public class WeixinPayment implements IPayment { @Override public void setPayParams() { System.out.println( "设置微信支付参数" ); } @Override public void pay() { System.out.println( "正在调用微信支付api..." ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | /** * @Description: 子模块角色:银联云闪付api **/ public class YunshanPayment implements IPayment { @Override public void setPayParams() { System.out.println( "设置云闪付支付参数" ); } @Override public void pay() { System.out.println( "正在调用云闪付支付api..." ); } } |
4、支付模块门面类
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** * @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、测试
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | /** * @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( "=============================" ); } } |
1 2 3 4 5 6 7 8 9 | 设置微信支付参数 正在调用微信支付api... ============================= 设置支付宝支付参数 正在调用支付宝支付api... ============================= 设置云闪付支付参数 正在调用云闪付支付api... ============================= |