【编码魔法师系列_结构型5】外观模式(Facade Pattern)

在这里插入图片描述

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通过不断的练习和实践,掌握其中的奥妙,选择合适的设计模式,能为我们的项目增加一丝神奇的魔力。

文章目录

  • 概念:
  • 实例:
  • 目的:
  • 适用场景:
  • 优点:
  • 弊端:
  • 类图:
  • 框架用到的地方:
  • Coding:
  • 测试
  • 测试结果

概念:

定义一个高层接口,这个接口使得子系统更加容易使用。外部与子系统通过一个统一的外观对象进行通信,来隐藏系统的复杂性。

实例:

AliPay按客户设置的消费顺序,找到余额足够的支付方式进行消费

目的:

通过暴露AliPay,帮助客户更简单的支付

适用场景:

系统有多个模块但你只希望提供给用户一个外观类时使用

优点:

1、对外提供一个接口,避免客户端直接与复杂系统交互
2、客户端与外观对象之间的依赖关系,减少了客户端与子系统之间的耦合度
3、外观模式可以在不影响客户端的情况下修改系统的实现

弊端:

违反开闭原则(如果子系统修改,我们不得不修改外观模式类的代码)

类图:

在这里插入图片描述

框架用到的地方:

在 MVC 架构中,Controller层是外观类。

Coding:

YuEbao

public class YuEbao {

    public static Integer balance = 10;

    public void useYuEbao(){
        System.out.println("通过余额宝消费");
    }

    public static Integer getBalance() {
        return balance;
    }
}

DepositCard

public class DepositCard {

    public static Integer balance = 1;

    public void useDepositCard(){
        System.out.println("通过借记卡消费");
    }

    public static Integer getBalance() {
        return balance;
    }
}

CreditCard

public class CreditCard {

    public static Integer balance = 3000;

    public void useCreditCard(){
        System.out.println("通过信用卡消费");
    }

    public static Integer getBalance() {
        return balance;
    }
}

AliPay

public class AliPay {

    CreditCard creditCard;
    DepositCard depositCard;
    YuEbao yuEbao;

    public void toPay(Integer price) {
        // 按客户设置的消费顺序,找到余额足够的支付方式进行消费
        if (yuEbao.getBalance() > price) {
            yuEbao.useYuEbao();
        } else if (creditCard.getBalance() > price) {
            creditCard.useCreditCard();
        } else if (depositCard.getBalance() > price) {
            depositCard.useDepositCard();
        } else {
            System.out.println("你买不起!");
        }
    }

    public AliPay() {
    }
}

测试

public static void main(String[] args) {
    AliPay aliPay = new AliPay();
    aliPay.toPay(10499);
}

测试结果

你买不起!

我们将“AliPay”看作是外观类,通过它我们就无需关心那张卡的余额足够消费的,通过“AliPay”传入消费金额,就可以自动选择支付方式了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

改三行代码就发了SCI一区?基于全面学习策略的Jaya算法!学会你也可以!CEC2017效果极佳!

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原始Jaya算法 改进Jaya算法策略详解&…

基于Verilog的简易CPU设计

前言 本篇文章将简单讲解CPU之间各部分的功能及接线,并提供Verilog模拟CPU的各个组成部分。该CPU可以完成一些操作,如:加减法,与或,指令跳转等,最后提供testbench用于测试该CPU的工作情况是否符合预期。 C…

keycloak18.0.0==前后端分离项目中使用,前端react后端springboot

配置keycloak 启动keycloak18 新建一个realm,名字叫test1 新建两个client,一个用于前端,一个用于后端 第一个 react http://localhost:8081/auth/realms/test1/react/ 第二个 backend-service 在两个client下分别创建role testRole backend-servic…

CF575H Bots 题解 组合数学

Bots(波特) 传送门 Sasha and Ira are two best friends. But they aren’t just friends, they are software engineers and experts in artificial intelligence. They are developing an algorithm for two bots playing a two-player game. The ga…

生产企业如何发现瓶颈工序并解决它

众所周知,瓶颈工序决定整体产能,产能均衡是高效生产的重要保证,在100个工序中,只要存在一个工序效率低下,那么99个工序的努力都无法解决整体产能落后的问题。 如何解决瓶颈工序产能不足问题,进而提高工厂整…

k8s部署InfluxDB

(作者:陈玓玏) 1. 拉取镜像 docker pull influxdb #拉取镜像 docker run -d influxdb:latest #后台运行容器 docker exec -it 89b /bin/bash #进入容器,89b是容器ID的前三位 cd /usr/bin #进入容器后,进入此文件夹…

【WPS】压缩图片

第一步: 点击插入,点击图片 第二步: 点击图片工具,点击压缩图片 第三步:

Git 遇到合并冲突如何解决

Git 遇到合并冲突解决方法 前言一、解决冲突 回滚二、将解冲突后的文件 提交到暂存区三、git commit 提交代码到本地Git仓库四、git push 提交五、注意 ​ 2024/3/13 前言 Git突然无法拉取下来,显示有合并冲突: 步骤:解决回滚解决冲突后、添…

数据结构-链表(二)

1.两两交换列表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 输入:head [1,2,3,4] 输出:[2…

[HackMyVm] Vinulizer

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

CCCorelib 点云ICP配准(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 ICP算法总共分为6个阶段,如下图所示: (1)挑选发生重叠的点云子集,这一步如果原始点云数据量比较巨大,一般会对原始点云进行下采样操作。 (2)匹配特征点。通常是距离最近的两个点,当然这需要视评判的准则而…

mysql不能远程连接的解决办法

问题: 安装完mysql之后,在本机可以正常使用,但是通过其它电脑不能远程连接. 解决方案: 在安装mysql的电脑上,登录mysql, 执行权限 GRANT ALL PRIVILEGES ON *.* TO root"%" IDENTIFIED BY "password"; 刷新权限 flush privileges;

C++(3/13)

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespace std; cla…

【C语言】C语言中执行命令

在C语言编程中&#xff0c;执行命令通常是通过调用库函数完成的。以下是一些C语言中用来执行系统命令的函数&#xff1a; 1. system(): 这是C语言标准库函数之一&#xff0c;能够执行命令行命令。它调用操作系统的命令处理器来执行给定的命令。 #include <stdlib.h>in…

雅特力AT32A403开发板评测 03 官方图形化配置工具Work Bench使用

03 雅特力AT32A403开发板评测 官方图形化配置工具Work Bench使用 1. 软硬件平台 AT32A403A Board开发板 MDK-ARM Keil Work Bench 2. AT32 Work Bench 为了方便开发者快速开发芯片&#xff0c;国外大厂的搞了单片机图形化配置工具&#xff0c;生成初始化配置代码&#x…

算法空间复杂度计算

目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法&#xff08;递归实现&#xff09;的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…

MyBatis3源码深度解析(十一)MyBatis常用工具类(四)ObjectFactoryProxyFactory

文章目录 前言3.6 ObjectFactory3.7 ProxyFactory3.8 小结 前言 本节研究ObjectFactory和ProxyFactory的基本用法&#xff0c;因为它们在MyBatis的源码中比较常见。这里不深究ObjectFactory和ProxyFactory的源码&#xff0c;而是放到后续章节再展开。 3.6 ObjectFactory Obj…

ES6(三):Iterator、Generator、类的用法、类的继承

一、迭代器Iterator 迭代器是访问数据的一个接口&#xff0c;是用于遍历数据结构的一个指针&#xff0c;迭代器就是遍历器 const items[one,two,three];//创建新的迭代器const ititems[Symbol.iterator]();console.log(it.next()); done&#xff1a;返回false表示遍历继续&a…

04_拖动文件渲染在页面中

新建一个文件夹&#xff0c;跟之前一样&#xff0c;在 Vscode 终端里输入 yarn create electron-app Drag。 在 index.html 添加以下代码&#xff0c;JS 文件夹和 render.js 都是新创建的&#xff1a; 首先&#xff0c;css 文件一般和 html 结合使用&#xff0c;相当于 html 是…

Prometheus 监控系统

目录 概述 Prometheus定义 Prometheus 的特点 Prometheus 的生态组件 Prometheus 的工作模式 Prometheus 的工作流程 Prometheus 的局限性 1.部署 Prometheus 上传prometheus包二级制安装 配置系统启动文件&#xff0c;启动 Prometheust 2.部署 Exporters 上传node…
最新文章