文章内容
一、什么是外观模式
外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式,也叫门面模式,属于结构型设计模式。
二、外观模式类图
三、外观模式角色
- 外观角色(Facade): 客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任,并将客户端的请求委派到相应的子系统对象。
- 子系统角色(SubSystem): 子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是单独的类,而是一个类的集合,子系统并不知道门面的存在。对于子系统而言,门面仅仅是一个客户端而已。
四、外观模式优缺点
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...
=============================