津津乐道设计模式 - 外观模式详解(简化女友使用你的支付账户购物的支付体验)

news2024/11/19 1:44:57

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 外观模式详解

  • 什么是外观模式
  • 外观模式的适用场景
  • 生活案例
  • 代码案例
  • 外观模式优点和缺点
  • 结语

什么是外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化接口,用于隐藏一组复杂的子系统背后的复杂性。通过外观模式,客户端与子系统之间的通信通过外观类进行,客户端只需要与外观类进行交互,而不需要直接与子系统的各个类进行交互。

外观模式的适用场景

  • 简化复杂系统:当一个系统非常复杂,包含多个子系统或模块,而客户端只需要与整个系统进行交互时,可以使用外观模式来简化客户端与系统之间的交互。外观类充当了一个门面,封装了底层子系统的复杂性,使得客户端可以更加方便地使用系统。

  • 提供统一接口:当系统中的多个子系统或模块具有不同的接口或协议时,可以使用外观模式来提供一个统一的接口给客户端使用。外观类充当了一个翻译者的角色,将客户端的请求转换为适合各个子系统的请求,从而使得客户端可以统一地与系统进行交互。

  • 隔离变化:当系统中的子系统发生变化时,通过外观模式,可以将变化局限在外观类中,而不会影响到客户端。客户端只需要与外观类进行交互,对于子系统的变化是透明的。

  • 提供高层接口:外观模式可以提供一个高层次的接口给客户端使用,隐藏了系统的复杂性,使得客户端更加专注于业务逻辑的实现,而不需要了解底层子系统的细节。

总的来说,外观模式适用于需要简化复杂系统、提供统一接口、隔离变化和提供高层接口的情况。它有助于降低系统的复杂性,提高系统的可维护性和可扩展性。然而,在使用外观模式时,需要注意避免过度设计和滥用,保持适度的简洁性和可读性。

生活案例

我相信你的女朋友一定很喜欢购物,她常常需要浏览一些购物平台,需要用你的账户登陆支付,假设我们有多种支付方式,如支付宝、微信支付和银行卡支付,每种支付方式都有自己的接口和交互逻辑,给女朋友带来了一定的困扰。为了让女友更方便地进行支付操作,我们可以使用外观模式来创建一个支付外观类。

以下模拟女朋友使用你账户支付的场景:

1、登录你的支付账号
2、出示付款码 / 输入卡号
3、确认支付

代码案例

首先,我们需要定义每种支付方式的具体类,它们负责处理各自的支付逻辑。例如,AlipayWeChatPayBankPay

// 支付宝支付逻辑
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();     // 使用银行卡支付

通过使用外观模式,客户端可以通过简单的方法调用来完成各种支付操作,而不需要了解每种支付方式的具体实现细节。外观模式将复杂的支付流程进行了封装,提供了一个简化的接口给客户端使用,使得支付过程更加方便和易于管理。

需要注意的是,上述例子是对外观模式在支付场景中的一种简化描述,并非真实的实现。实际应用中,外观模式的设计和实现可以根据具体的支付系统和需求进行调整和扩展。

外观模式优点和缺点

优点

  • 简化客户端使用:外观模式提供了一个统一的接口给客户端使用,隐藏了系统内部的复杂性,使得客户端更加简单地与系统进行交互。
  • 解耦系统组件:外观模式将子系统与客户端解耦,使得系统的各个组件可以独立演化和修改,而不会对客户端产生影响。
  • 提高系统可维护性:外观模式将系统的复杂性集中在外观类中,便于系统的维护和修改。

缺点

  • 增加了一个额外的抽象层:引入外观模式会增加一个额外的抽象层,有时会导致系统更加复杂。
  • 不符合开闭原则:在需要新增或修改子系统的行为时,可能需要修改外观类的代码,违背了开闭原则。
  • 可能影响性能:由于外观模式需要通过外观类调用多个子系统,可能会影响系统的性能。

结语

本章节主要介绍了外观模式、外观模式适用场景、外观模式的优缺点,并以女友使用你支付账户购物的生活场景模拟外观模式的样例代码,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

样例代码:https://github.com/lhmyy521125/toher-designmode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spark外置external shuffle service使用介绍

shuffle是什么 shuffle是Hadoop大数据计算中,一个必不可少的环节,通过shuffle可以将不同节点上的同类数据给移动到一起,这在分组,排序,聚合的场景中非常常见,简单图示如下: MapReduce数据处理模…

Vue.js中的状态管理:理解和使用Vuex

目录 前言 Vue.js 样式绑定 Vue.js class class 属性绑定 实例 1 实例 2 实例 3 实例 4 数组语法 实例 5 实例 6 Vue.js style(内联样式) 实例 7 实例 8 实例 9 Vue.js 组件 全局组件 全局组件实例 局部组件 局部组件实例 Prop Prop 实例 动态 Prop Pro…

echarts+echarts-gl vue2制作3D地图+下钻功能+标记点功能,解决dblclick事件失效问题,解决地图下钻后边框不更新保留问题

目录 先看实现效果:​编辑 步骤一 安装echarts和echarts-gl 步骤二 设置地图容器 在methods中设置初始化地图方法并在mounted中调用 在methods中设置初始化地图方法 在mounted中调用 打开页面效果:​编辑 步骤三 1、给地图添加双击事件dblcli…

Linux安装后门监测工具chkrootkit

官网:chkrootkit -- locally checks for signs of a rootkit locally checks for signs of a rootkit Chkrootkit is named Top 10 Tools to Scan Linux Servers for Vulnerability and Malware by Cyber Security News. Debian安装 sudo apt install chkrootkit#…

BigDecimal有哪些坑?

BigDecimal概述 BigDecimal是Java编程语言中的一个类,用于进行高精度的十进制数值计算。它提供了精确的数值表示和计算,可以处理比基本数据类型(如double和float)更大范围和更高精度的数字。 Java的基本数据类型(如i…

在线考试教学系统平台系统源码/视频教学系统PHP源码/在线考试系统PHP源码

在线考试教学系统平台系统源码,视频教学系统PHP源码,在线考试系统PHP源码。 安装说明: 1、部署好网站环境:php5.6mysql 2、将源码传至网站根目录,php源码用二进制上传,或者上传压缩包在空间解压 3、将据库…

独热编码和Embedding

对于一个大小为N词典,给出一个N*N的矩阵。将这些词分别进行编码。再者,例如,香蕉与水果这两个词词意接近,我们引进余弦相似度来计算两者相似度。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似。…

团体程序设计天梯赛-练习集L2篇⑧

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

css基础(三)

目录 一、CSS三大特性 1.层叠性 2.继承性 3.行高的继承 4.CSS三大特性之优先级 5.优先级注意的问题 6.CSS权重的叠加 二、盒子模型 1.盒子模型组成部分 2.盒子模型边框border 3.边框的复合写法 4.表格细线边框 5.边框会影响盒子实际大小 6.盒子模型内边距padding 7.盒子模型外边…

文心一言 VS 讯飞星火 VS chatgpt (49)-- 算法导论6.2 1题

一、参照图6-2的方法,说明 MAX-HEAPIFY(A,3)在数组 A(27,17,3,16,13,10,1,5,7,12,4,8,9,0)上的操作…

怪物设计记录

一、怪物的对抗性 《怪物猎人世界》 1.生态系的重视,高低差,怪物密度 3.怪物的活动范围 4.瘴气之谷 设定:鲸落等等 5.设定上的爬升 6.怪物设计原则: 和同一只怪物多次战斗,仍然能感觉到乐趣 让玩家尝试不同种类的…

责任链模式(Chain of Responsibility)

别名 命令链(Chain of Command)。 定义 责任链是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。 前言 1. 问题 假如你正在开发一…

监听器-Listener

Servlet规范中的监听器-Listener 观察者设计模式, 所有的监听器都是观察者设计模式的体现。 什么是观察者设计模式呢? 它是事件驱动的一种体现形式。就好比在做什么事情的时候被人盯着。当对应做到某件事时,触发事件。 观察者模式通常由以下三部分组成…

【话题达人】你觉得存款难吗?如何看待半数年轻人存款不住10万?这不是基操

导读 近日,有调查称 大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”,存款超过10万就会超过53.7%的人。年轻人(23-28) 和 存款 两个词碰撞在一起,引来了广泛的关注和讨论。你认为年轻人存款难吗? 先说结论&#…

程序员之马上结束任务

计算机系的男同学追班里一女同学,结果此女总是躲躲闪闪。 男的看没戏,就另找了一个去追,结果这女的不满意了,质问这男的为啥抛弃她。 男的问:“请教一个电脑问题,如果你点击一个程序,总是提示…

浓浓书香伴新春,TVP邀你共读7本精选好书!

引言 颜之推在《颜氏家训勉学》中曾云“夫所以读书学问,本欲开心明目,利于行耳。”所谓读书学问,就是要开阔自己的胸襟,提高自己的鉴别力,从而有利于亲身实践。岁末年初,庭前飘雪,TVP 带你赴一场…

刚去了家新公司,发现个个都是卷王 , 真想离职了。。。

个个都说想躺平了,可是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,才工作一年,跳槽到我们公司起薪15K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。…

Python元组、集合、字典

总有一天你要一个人在暗夜中,向那座桥走过去 文章目录 一、元组 字符串、元组、列表的总结 二、集合 1.定义空集合 2.创建集合 (1)直接创建 (2)set函数 3.列表、元组、字符串、字典的去重 4.向集合中添加元素…

VUE-001-在表格单元格(el-table-column)中添加超链接访问

在进行前端网页开发时&#xff0c;通常列表数据我们使用table展示。那么如何在 el-table-column 单元格中使用超链接呢&#xff1f; 如下即是解决方式的一种&#xff1a; 仅需要将如下代码&#xff1a; <el-table-column prop"url" label"访问链接" …

软件测试入门(测试环境及用例编写)

目录 一、什么是软件环境 二、软件运行环境类型 三、什么是测试用例&#xff08;测试case&#xff09; 四、测试用例包含哪些信息 五、测试用例设计方法 六、如何设计一个功能点的case 一、什么是软件环境 人有人类的生存环境&#xff1b;软件有软件的运行环境 二、软件…