外观模式(结构型)

目录

一、前言

二、外观模式

三、总结


一、前言

        外观模式(Facade Pattern)是一种结构型设计模式,它为系统中的一组复杂子系统提供一个简单的接口,从而隐藏了这些子系统的复杂性,并且使得代码更加易于使用和理解。

        外观模式的核心思想是将复杂的系统拆分成多个子系统,每个子系统负责一个特定的任务。然后,外观类作为这些子系统的总管,将它们组织起来,提供一个简单的接口供客户端使用。这样一来,客户端就不需要了解系统内部的复杂性和细节,只需要通过外观类提供的简单接口来访问系统即可。这种方式可以有效地降低系统的耦合度,使得系统更加易于维护和扩展。

二、外观模式

        比如对于基金而言,买卖基金就相当于是个外观模式,对于买卖基金,可以看做是一个外观类,我们不需要过多去关心基金里面的股票、债券等的买卖,从而让我们理财变得更加轻松。根据外观模式的特点可以有类图:

        首先需要我们写好子系统的类:

public class StockSubSystemOne {

    public void buy(){
        System.out.println("股票一买入");
    }

    public void sell(){
        System.out.println("股票一卖出");
    }
}
public class StockSubSystemTwo {
    public void buy(){
        System.out.println("股票二买入");
    }

    public void sell(){
        System.out.println("股票二卖出");
    }
}
public class BondSubSystemOne {
    public void buy(){
        System.out.println("债券一买入");
    }

    public void sell(){
        System.out.println("债券一卖出");
    }
}
public class BondSubSystemTwo {
    public void buy(){
        System.out.println("债券二买入");
    }

    public void sell(){
        System.out.println("债券二卖出");
    }
}

        接着编写我们的外观基金类:

public class FundFacade {
    private StockSubSystemOne stockSubSystemOne;

    private StockSubSystemTwo stockSubSystemTwo;

    private BondSubSystemOne bondSubSystemOne;

    private BondSubSystemTwo bondSubSystemTwo;

    public FundFacade(){
        stockSubSystemOne = new StockSubSystemOne();
        stockSubSystemTwo = new StockSubSystemTwo();
        bondSubSystemOne = new BondSubSystemOne();
        bondSubSystemTwo = new BondSubSystemTwo();
    }

    public void buyFund(){
        stockSubSystemOne.buy();
        stockSubSystemTwo.buy();
        bondSubSystemOne.buy();
        bondSubSystemTwo.buy();
    }

    public void sellFund(){
        stockSubSystemOne.sell();
        stockSubSystemTwo.sell();
        bondSubSystemOne.sell();
        bondSubSystemTwo.sell();
    }

}

        最后是客户端调用类:

public class FacadeClient {
    public static void main(String[] args) {
        FundFacade fundFacade = new FundFacade();

        fundFacade.buyFund();

        fundFacade.sellFund();
    }
}

        运行结果:

三、总结

        其中几个关键角色:

1. 外观(Facade):外观类是外观模式的核心,它提供了一个简单的接口,封装了系统中多个子系统的复杂性。外观类知道哪些子系统负责处理哪些请求,将客户端的请求委派给相应的子系统进行处理。

2. 子系统(Subsystem):子系统是指系统中的多个模块或类,每个子系统负责一个特定的任务。子系统并不知道外观类的存在,它们只是被外观类组织起来,为外部提供服务。

3. 客户端(Client):客户端是指使用系统的调用者,它通过外观类提供的简单接口来访问系统,而不需要了解系统内部的复杂性和细节。

        在外观模式中,外观类扮演了重要的角色,它是整个系统的门面,提供了一个简单、统一的接口,隐藏了系统内部的复杂性。而子系统则负责具体的实现,它们被外观类组织起来,为外部提供服务。客户端则通过外观类来访问子系统,从而完成自己的任务。

        优点与缺点:

优点:

1. 简化了系统的调用方式:外观类提供了一个简单的接口,隐藏了系统内部的复杂性。客户端只需要通过外观类来访问子系统,不需要了解子系统的实现细节,从而简化了系统的调用方式。

2. 降低了系统的耦合度:外观模式将子系统和客户端解耦,减少了它们之间的依赖关系。这样一来,系统的维护和扩展就更加容易,也提高了系统的灵活性。

3. 提高了代码的可重用性:外观类封装了系统内部的复杂性,使得系统的各个部分可以独立地进行开发和测试。这样一来,每个子系统都可以被重复利用,提高了代码的可重用性。

4. 易于扩展和维护:外观模式将系统拆分成多个子系统,每个子系统都可以独立地进行扩展和维护。这样一来,系统的整体扩展和维护也变得更加容易。

缺点:

1. 可能会导致性能问题:外观模式会增加一个额外的间接层,可能会影响系统的性能。因此,在设计系统时需要权衡使用外观模式的优点和缺点。

2. 不符合单一职责原则:外观类的职责较大,可能会包含多个子系统的逻辑。这可能会导致外观类的复杂性增加,不符合单一职责原则。

3. 可能会隐藏系统的复杂性:外观模式通过封装系统的复杂性来简化系统的调用方式,但是这也可能会导致客户端对系统的实现细节缺乏了解,不利于系统的优化和调试。

        使用场景:

1. 当系统包含多个子系统时,可以使用外观模式将这些子系统组合成一个整体,为客户端提供简单的接口。这样一来,客户端就可以通过外观类来访问子系统,而不需要了解子系统的实现细节。

2. 当系统的接口复杂或难以理解时,可以使用外观模式对接口进行封装,使其更易于理解和使用。外观类可以将复杂的接口转换成更直观的接口,从而提高系统的易用性。

3. 当需要对系统进行重构时,可以使用外观模式将系统进行拆分和重组。外观类可以将系统拆分成多个子系统,每个子系统都可以独立地进行开发和测试。这样一来,系统的整体扩展和维护也变得更加容易。

4. 当需要对系统进行封装和保护时,可以使用外观模式来限制客户端对系统的直接访问。外观类可以对系统进行封装,限制客户端的访问权限,从而提高系统的安全性。

5. 当需要为一个复杂系统提供一个简单的接口时,可以使用外观模式来为系统提供一个高层次的抽象。外观类可以将系统的复杂性隐藏起来,为客户端提供一个简单的接口,从而降低系统的使用难度。

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

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

相关文章

XUbuntu22.04之免费开源DesktopNaotu脑图(二百零七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

5个99%的人可能不知道的实用程序库!

前言 作为一名前端开发者,这些 JavaScript 库极大地提高了我的工作效率,如格式化日期、处理 URL 参数和调试移动网页。朋友们,我想和你们分享这些库。 1. 使用 “Day.js” 来格式化日期和时间 链接 作为开发者,我已经厌倦了在 JavaScript 中操作日期和时间,因为它太麻烦了。…

MySQL的多表数据记录查询笔记

关系数据操作 合并查询数据记录 在MySQL中通过关键字UNION来实现并操作,即可以通过其将多个SELECT语句的查询结果合并在一起组成新的关系。 两张表,表1 和表2 带有关键字UNION的合并操作 关键字UNION会把查询结果集直接合并在一起,同时将…

vite和webpack的区别

1 构建原理 Webpack 是一个静态模块打包器,通过对项目中的 JavaScript、CSS、图片等文件进行分析,生成对应的静态资源,并且可以通过一些插件和加载器来实现各种功能。Webpack 的主要特点是支持各种复杂的构建场景,例如代码分割、…

vs2022配置OpenCV测试

1,下载Opencv安装包 OpenCV官网下载地址:Releases - OpenCV 大家可以按需选择版本进行下载,官网下载速度还是比较慢的,推荐大家使用迅雷进行下载 下载安装包到自定义文件夹下 双击安装 按以下图示进行安装 2、 添加环境变量 打…

【HarmonyOS】消息通知场景的实现

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

浪花 - 搜索标签前后端联调

前传:浪花 - 根据标签搜索用户-CSDN博客 目录 一、完善后端搜索标签接口 二、前后端搜索标签接口的对接 1. 使用 Axios 发送请求 2. 解决跨域问题 3. Axios 请求传参序列化 4. 接收后端响应数据 5. 处理后端响应数据格式 6. 搜索结果为空的页面展示 附&am…

HCIA——11计算机网络分层结构——OSI/ISO、TCP/IP

学习目标: 参考模型 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本…

Pycharm 神级插件 Grep Console

下载: 使用: 为了方便测试这款插件的功能,我们可以写一段代码 来测试 import logging import time# 配置日志 logging.basicConfig(levellogging.DEBUG) logger logging.getLogger(__name__)# 日志消息中的字典内容 log_message """ {413867144: {202401031…

计算机导论09-数据组织与管理

文章目录 数据管理基础数据管理技术的发展数据组织与管理的发展手工数据处理阶段文件方式的数据处理阶段数据库数据处理阶段 数据库技术的发展 数据模型数据模型的要素概念模型逻辑模型 数据库系统数据库系统基础数据库系统构成 数据库系统的结构数据库系统的体系结构数据库系统…

smartgit选择30天试用后需要输入可执行文件

突然有一天smartgit提示到期了,我按照以往那样删除license和preferences文件后,选择30天试用,弹出了需要选择git可执行文件。 我尝试选择了我的git.exe,发现根本不行,提示让我执行下git --version 执行过后提示我的.gi…

HCIP之ISIS实验

华子目录 实验拓扑及要求规划IP地址规划Level1/2路由器实验步骤配置IP地址启动ISIS修改对应路由类型路由泄露:R1访问R5走R6测试 实验拓扑及要求 规划IP地址 规划Level1/2路由器 实验步骤 配置IP地址 R1-R8依次类推 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

【Java SE】类和对象详解

文章目录 1.什么是面向对象2. 类的定义和使用2.1 简单认识类2.2 类的定义格式 3. 类的实例化3.1 什么是实例化3.1.1 练习(定义一学生类) 3.2 类和对象的说明 4. this 引用5. 构造方法6. 对象的初始化6.1 默认初始化6.2 就地初始化 7. 封装7.1 封装的概念…

WhatsApp Business有哪些好处?

WhatsApp 被认为是全球领先的移动通讯应用程序,在全球拥有约20 亿月活跃用户,已成功跻身全球最受欢迎的社交平台Top3。由于其显著增长的知名度和WhatsApp Business的加入,WhatsApp 已成为企业与其客户互动沟通最有效的方式之一。 使用WhatsA…

MySQL面试题 | 12.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Vue-23、Vue过滤器

1、效果 2、过滤器实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>过滤器</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.…

如何在云端加速缓存构建

缓存是指将某类数据存储起来以便以后重复使用的过程&#xff0c;它的运用在开发场景中非常普遍。类似于你习惯把最常用的调料放在厨房台面上&#xff0c;而不是橱柜里&#xff0c;这样你在准备大餐时就可以轻松取用。 但对于一个更为技术性、更精确的用例&#xff0c;比如像谷…

linux单机部署mysql(解压编译方式)

一、下载官网压缩包&#xff08;tar.gz&#xff09; MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/根据自己的操作系统发行版本、位数、gclib版本、mysql版本来选择对应的压缩包 比如我是 linux系统debian10&#xff08;官网只有linux ge…

【文本到上下文 #3】:文本表示技术

一、说明 欢迎回到“完整的 NLP 指南&#xff1a;文本到上下文” 在上一篇文章中&#xff0c;我们对自然语言处理 (NLP) 中的基本数据预处理步骤进行了令人着迷的探索。我们剖析了标记化、文本清理、停用词删除、词干提取和词形还原、词性标记和命名实体识别 (NER) 的复杂性。这…

自动驾驶轨迹规划之碰撞检测(二)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.基于凸优化 2.具身足迹 3. ESDF 自动驾驶轨迹规划之碰撞检测&#xff08;一&#xff09;-CSDN博客 大家可以先阅读之前的博客 1.基于…