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

news2024/11/17 11:21:34

在这里插入图片描述

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(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.coloradmin.cn/o/1515354.html

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

相关文章

goctl-swagger 生成json接口文件

参考: GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境,不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…

深入浅出落地应用分析:AI数字人「微软小冰」

hi,各位,今天要聊的是AI小冰,机缘巧合,投递了这家公司的产品,正好最近在看数字人相关的,就详细剖析下这款产品! 前言 小冰,全称为北京红棉小冰科技有限公司,前身为微软(亚洲)互联网工程院人工智能小冰团队,是微软全球最大的人工智能独立产品研发团队。作为微软全…

2024.3.13

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

爬虫与DataFrame对象小小结合

import pandas as pd import requests from lxml import etree #数据请求 url"https://www.maigoo.com/brand/list_1715.html" headers{User-Agent:} #数据响应 resrequests.get(url,headersheaders) tree etree.HTML(res.text) #数据解析 titletree.xpath(.//div[c…

vxe-table表格组件的使用已经query函数扩展

最近新项目使用vue3typescript开发后台管理系统&#xff0c;基本上展示内容一致表格的方式展示&#xff0c;所以使用vxe-table组件来开发&#xff0c;主要是为了方便使用工具栏&#xff0c;以及其他表格操作。 vxe-table 开发文档&#xff1a;https://vxetable.cn/#/table/sta…

qiankun:vite/webpack项目配置

相关博文&#xff1a; https://juejin.cn/post/7216536069285429285?searchId202403091501088BACFF113F980BA3B5F3 https://www.bilibili.com/video/BV12T411q7dq/?spm_id_from333.337.search-card.all.click qiankun结构&#xff1a; 主应用base&#xff1a;vue3historyv…

通过Maven创建Web工程

通过Maven创建Web工程 方式一方式二 方式一 1.先创建一个Maven工程 2.把该Maven模块的pom文件里添加一个war 3.选中该Maven模块 点击项目架构 4.手动添加一个Web架构 方式二 1.也是new一个模块 但是直接配置好Web 2.这里就是我IDEA对Maven的设置 3.第一次创建 可能…

JavaEE框架学习笔记——Mybatis篇

四、一级缓存 五、二级缓存 一、Mybatis的Dao编写【mapper代理方式实现】 Mapper代理的开发方式&#xff0c;程序员只需要编写mapper接口&#xff08;相当于dao接口&#xff09;即可。Mybatis会自动的为mapper接口生成动态代理实现类。不过要实现mapper代理的开发方式****&am…

酷开科技大内容战略,打破时间和空间的限制畅快追剧!

随着科技的发展&#xff0c;电视作为家庭娱乐中心设备的角色正在发生改变&#xff0c;它不仅仅 是家庭的娱乐中心&#xff0c;更是成为连接家庭智能家居的中心枢纽&#xff0c;为家庭带来更为丰富和个性化的娱乐体验。深耕大屏十余年&#xff0c;酷开科技通过技术上的不断突破和…

nacos做注册注册中心go语言实战教程(服务的注册与获取)

背景 随着访问量的逐渐增大&#xff0c;单体应用结构渐渐不满足需求&#xff0c;在微服务出现之后引用被拆分为一个个的服务&#xff0c;服务之间可以互相访问。初期服务之间的调用只要知道服务地址和端口即可&#xff0c;而服务会出现增减、故障、升级等变化导致端口和ip也变…

LeetCode Python - 51. N 皇后

目录 题目答案运行结果 题目 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n …

深度学习——SAM(Segment-Anything)代码详解

目录 引言代码目录segment-anything 代码详解build_sam.pypredictor.pyautomatic_mask_generator.py 引言 从去年年初至今&#xff0c;SAM(Segment Anything )已经问世快一年了&#xff0c;SAM凭借其强大而突出的泛化性能在各项任务上取得了优异的表现&#xff0c;广大的研究者…

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊&#xff0c;不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…

linux安全--CentOS7安装Tomcat,远程管理ManagerApp

目录 1.Tomcat安装 2.Tomcat远程管理 1.Tomcat安装 下载安装包并解压 tar xf apache-tomcat-7.0.54.tar.gz -C /usr/local/apache-tomcat_7.0.54/tomcat启停 启动 ./startup.sh 停止 ./shutdown.sh 2.Tomcat远程管理 找到tomcat文件夹中webapps/manager/META-INF/contex…

IDEA中导入eclipse运行的java项目

本篇文章主要的内容是在IDEA中导入eclipse运行的java项目&#xff0c;亲测有效。 话不多说&#xff0c;直接开整。 前提&#xff1a;先打开idea软件&#xff0c;界面如下&#xff1a; 开始按下方步骤依次走即可。 1、file --> new --> Project from Existing Sources..…

OPPO后端二面,凉了!

这篇文章的问题来源于一个读者之前分享的 OPPO 后端凉经&#xff0c;我对比较典型的一些问题进行了分类并给出了详细的参考答案。希望能对正在参加面试的朋友们能够有点帮助&#xff01; Java String 为什么是不可变的? public final class String implements java.io.Seri…

C++提高笔记(三)---STL容器(vector、deque)

1、vector容器 1.1vector基本概念 功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0…

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

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

Kafka MQ 生产者

Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单&#xff0c;但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始&#xff0c;ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…

linux命令深入研究——cat

cat命令&#xff0c;“猫”&#xff0c;可以理解为瞄一眼文件内容&#xff0c;其中可以用重定向符号对文件进行一些修改&#xff0c;如增加&#xff0c;删除文件内容&#xff0c;其命令参数如-n&#xff0c;-s&#xff0c;-b可以输出带有行号的行 如果想要快速删除文件内容&…