😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
什么是外观模式
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化接口,用于隐藏一组复杂的子系统背后的复杂性。通过外观模式,客户端与子系统之间的通信通过外观类进行,客户端只需要与外观类进行交互,而不需要直接与子系统的各个类进行交互。
外观模式的适用场景
-
简化复杂系统
:当一个系统非常复杂,包含多个子系统或模块,而客户端只需要与整个系统进行交互时,可以使用外观模式来简化客户端与系统之间的交互。外观类充当了一个门面,封装了底层子系统的复杂性,使得客户端可以更加方便地使用系统。 -
提供统一接口
:当系统中的多个子系统或模块具有不同的接口或协议时,可以使用外观模式来提供一个统一的接口给客户端使用。外观类充当了一个翻译者的角色,将客户端的请求转换为适合各个子系统的请求,从而使得客户端可以统一地与系统进行交互。 -
隔离变化
:当系统中的子系统发生变化时,通过外观模式,可以将变化局限在外观类中,而不会影响到客户端。客户端只需要与外观类进行交互,对于子系统的变化是透明的。 -
提供高层接口
:外观模式可以提供一个高层次的接口给客户端使用,隐藏了系统的复杂性,使得客户端更加专注于业务逻辑的实现,而不需要了解底层子系统的细节。
总的来说,外观模式适用于需要简化复杂系统、提供统一接口、隔离变化和提供高层接口的情况。它有助于降低系统的复杂性,提高系统的可维护性和可扩展性。然而,在使用外观模式时,需要注意避免过度设计和滥用,保持适度的简洁性和可读性。
生活案例
我相信你的女朋友一定很喜欢购物,她常常需要浏览一些购物平台,需要用你的账户登陆支付,假设我们有多种支付方式,如支付宝、微信支付和银行卡支付,每种支付方式都有自己的接口和交互逻辑,给女朋友带来了一定的困扰。为了让女友更方便地进行支付操作,我们可以使用外观模式来创建一个支付外观类。
以下模拟女朋友使用你账户支付的场景:
1、登录你的支付账号
2、出示付款码 / 输入卡号
3、确认支付
代码案例
首先,我们需要定义每种支付方式的具体类,它们负责处理各自的支付逻辑。例如,Alipay
、WeChatPay
和 BankPay
// 支付宝支付逻辑
public class Alipay {
public void login() {
// 登录支付宝账号
}
public void showQRCode() {
// 出示付款码
}
public void confirmPayment() {
// 确认支付
}
}
// 微信支付逻辑
public class WeChatPay {
public void login() {
// 登录微信账号
}
public void showQRCode() {
// 出示付款码
}
public void confirmPayment() {
// 确认支付
}
}
// 银行卡支付逻辑
public class BankPay {
public void login() {
// 登录银行账号
}
public void inputCardInfo() {
// 输入银行卡信息
}
public void confirmPayment() {
// 确认支付
}
}
接下来,我们创建一个支付外观类 PaymentFacade,它封装了各种支付方式的复杂逻辑,并提供了简单的接口给客户端使用
public class PaymentFacade {
private Alipay alipay;
private WeChatPay weChatPay;
private BankPay bankPay;
public PaymentFacade() {
this.alipay = new Alipay();
this.weChatPay = new WeChatPay();
this.bankPay = new BankPay();
}
public void payWithAlipay() {
alipay.confirmOrder();
alipay.login();
alipay.confirmPayment();
}
public void payWithWeChatPay() {
weChatPay.confirmOrder();
weChatPay.login();
weChatPay.confirmPayment();
}
public void payWithBankPay() {
bankPay.confirmOrder();
bankPay.login();
bankPay.confirmPayment();
}
}
整体代码目录如下:
现在,客户端只需要与支付外观类 PaymentFacade 进行交互,而不需要直接与各种支付方式类打交道
PaymentFacade paymentFacade = new PaymentFacade();
paymentFacade.payWithAlipay(); // 使用支付宝支付
paymentFacade.payWithWeChatPay(); // 使用微信支付
paymentFacade.payWithBankPay(); // 使用银行卡支付
通过使用外观模式,客户端可以通过简单的方法调用来完成各种支付操作,而不需要了解每种支付方式的具体实现细节。外观模式将复杂的支付流程进行了封装,提供了一个简化的接口给客户端使用,使得支付过程更加方便和易于管理。
需要注意的是,上述例子是对外观模式在支付场景中的一种简化描述,并非真实的实现。实际应用中,外观模式的设计和实现可以根据具体的支付系统和需求进行调整和扩展。
外观模式优点和缺点
优点
- 简化客户端使用:外观模式提供了一个统一的接口给客户端使用,隐藏了系统内部的复杂性,使得客户端更加简单地与系统进行交互。
- 解耦系统组件:外观模式将子系统与客户端解耦,使得系统的各个组件可以独立演化和修改,而不会对客户端产生影响。
- 提高系统可维护性:外观模式将系统的复杂性集中在外观类中,便于系统的维护和修改。
缺点
- 增加了一个额外的抽象层:引入外观模式会增加一个额外的抽象层,有时会导致系统更加复杂。
- 不符合开闭原则:在需要新增或修改子系统的行为时,可能需要修改外观类的代码,违背了开闭原则。
- 可能影响性能:由于外观模式需要通过外观类调用多个子系统,可能会影响系统的性能。
结语
本章节主要介绍了外观模式、外观模式适用场景、外观模式的优缺点,并以女友使用你支付账户购物的生活场景模拟外观模式的样例代码,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~