外观模式(结构型)

news2024/11/14 23:57:55

目录

一、前言

二、外观模式

三、总结


一、前言

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

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

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

相关文章

推荐系统模型(一) DFN 详解 Deep Feedback Network for Recommendation

背景 在大多数的推荐系统中,往往注重于隐式正反馈(例如:点击),而忽略掉用户的其他行为(例如大多数CTR模型只考虑用户的喜欢,而忽略了不喜欢)。腾讯在Deep Feedback Network for Recommendation 一文中,提出了一个新颖…

VitePress-01-从零开始的项目创建(npm版)

说明 本文介绍一下 VitePress的项目创建的步骤。 主要用到的命令工具是 npm。 本文的操作步骤是从无到有的创建一个完整的基本的【VitePress】项目。 环境准备 根据官方文档的介绍,截止本文发稿时,需要使用node.js 18 的版本。 可以使用node -v 的命令查…

Electron+React项目打包踩坑记录

首先,如何打包 写下本文的时间是 2024/01/16,搜索了网络上 ElectronReact 的打包方式,中间行不通,本文采用的方式是记录本文时 Electron 快速入门(https://www.electronjs.org/zh/docs/latest/tutorial/quick-start)记录的打包方式…

电子学会C/C++编程等级考试2023年05月(八级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示) Bob and Alice 过去住在城市 1.在注意到Alice在他们过去喜欢玩的纸牌游戏中作弊后,Bob和她分手…

vtk9.3 配置 visual studio 2019 运行环境 和运行实例详解

(1)包含文件配置: 项目--属性--VC目录,在包含目录中把include文件夹的地址加进去,一直要到下一级 vtk-9.3目录下, 小知识: 在Visual Studio 2019中运行项目时,如果项目中使用了第三…

SpringBoot项目中简单使用虚拟机Redis

目录 步骤大致如下: 一.在pom文件中加入redis依赖 二.在虚拟机上打开我们下载好的Redis。开启服务器端并获取虚拟机ip地址 三.在项目配置。 四:使用redis 测试 redis是一个以键值对存储的NoSQL。被数百万开发人员用作缓存、矢量数据库、文档数据库、…

SpringBoot-项目复制

Spring Boot是一个用于简化Java应用程序开发的框架,它提供了自动配置和约定优于配置的原则。项目复制是指通过复制现有的Spring Boot项目来创建一个新的项目,以便快速搭建基于相似功能或结构的应用程序。项目复制可以减少类似项目的开发时间、提高生产力…

MongoDB 环境搭建及使用详解

文章目录 1、安装1.1 window平台安装MongoDB1.2 Linux系统中安装启动和连接 2、MongoDB连接3、MongoDB 概念数据库(DATABASE)文档(Document)集合元数据 4、常用语法创建数据库删除数据库创建集合查看创建的集合删除集合文档CRUD 5…

Rust 错误处理(上)

目录 1、用 panic! 处理不可恢复的错误 对应 panic 时的栈展开或终止 1.1 使用 panic! 的 backtrace 2、用 Result 处理可恢复的错误 2.1 匹配不同的错误 2.2 失败时 panic 的简写:unwrap 和 expect 2.3 传播错误 错误是软件中不可否认的事实,所…

Kafka详解及常见面试问题解析(值得珍藏)

1. 定义 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。它是一种高吞吐量的分布式发布订阅消息系统,可以处理消费者在网站中的所有动作流数据。这种动作(网页浏览,搜索和其他用户的行动)是在…

Visual Studio 2022 成功配置QT5.12.10

目录 下载并安装Visual Studio 2022 Qt5.12.10下载 Qt5.12.10安装 Qt VS Tools for Visual Studio 2022下载 Visual Studio 2022配置 测试 下载并安装Visual Studio 2022 下载社区版并安装,这个比较快。 Qt5.12.10下载 官网下载很慢,还不如百度网…

【加强版】小学数学出题,加减乘除混合运算,支持自定义数字,一键打印

在线预览:在线HTML代码预览和运行工具 - UU在线工具 复制下面代码后到该地址预览即可 注意:在线预览不能打印。如需打印,在电脑本地上新建文本文档,粘贴代码后保存,然后把文件后缀改为.html运行,出题点击…

不同打包工具下的环境变量配置方式对比

本文作者为 360 奇舞团前端开发工程师 天明 前言 在现代的JavaScript应用程序开发中,环境变量的配置是至关重要的。不同的应用场景和部署环境可能需要不同的配置,例如开发、测试和生产环境。最常见的需求是根据不同的环境,配置如是否开启sour…

如何编译openssl的早期版本的共享库,如openssl 1.0

背景介绍 最近在为客户排查问题的时候,发现客户提供的日志是加密的,解密工具依赖到了openssl 1.0的共享库。可是手头没有这么老版本的openssl共享库。因此只好手动编译一个出来。 编译步骤 因为openssl 1.0是比较老的版本,很多系统上的库已…

如何安装“MySQL在虚拟机ubuntu”win10系统?

1、 更新列表 sudo apt-get update 2、 安装MySQL服务器 sudo apt-get install mysql-server 3、 安装MySQL客户端 sudo apt-get install mysql-client 4、 配置MySQL sudo mysql_secure_installation 5、 测试MySQL systemctl status mysql.service MySQL数据库基本…

数学建模常见算法的通俗理解(更新中)

目录 1.层次分析法(结合某些属性及个人倾向,做出某种决定) 1.1 粗浅理解 1.2 算法过程 1.2.1 构造判断矩阵 1.2.2 计算权重向量 1.2.3 计算最大特征根 1.2.4 计算C.I.值 1.2.5 求解C.R.值 ​1.2.6 判断一致性 1.2.7 计算总得分 2 神…

武理多媒体信息共享平台的架构设计与实现

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

开发知识点-java基础

java基础知识整理 windows 多版本java jar包不能直接打开 需要java -jar问题解决 windows 多版本 控制面板 java15 download 多版本 https://www.cnblogs.com/chenmingjun/p/9941191.html https://gitee.com/shixinke/JC-jEnv/repository/archive/master.zip java jar包不…

Packet Tracer - Layer 2 VLAN Security

Packet Tracer - 第二层VLAN安全配置任务 目标 在SW-1和SW-2之间建立新的冗余链路。在新连接的SW-1和SW-2之间的干线链路上启用中继并配置安全措施。创建一个新的管理VLAN(VLAN 20)并将一台管理PC连接到该VLAN。实施ACL以防止外部用户访问管理VLAN。 背…

【全】OpenSSL创建生成CA证书、服务器、客户端证书及密钥说明

本文章对应的文档:使用OpenSSL创建生成CA证书服务器客户端证书及密钥资源-CSDN文库 https://download.csdn.net/download/weixin_41885845/88746920 对于SSL单向认证 服务器需要CA证书、server证书、server私钥,客户端需要CA证。 对于SSL双向认证 服务器需要CA证书、serv…