技术成神之路:设计模式(二十一)外观模式

news2025/1/12 18:19:35

在这里插入图片描述
相关文章:技术成神之路:二十三种设计模式(导航页)

介绍

外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口,使得子系统更容易使用。

1. 定义


外观模式通过引入一个外观类,来简化与复杂系统的交互。这个外观类对外提供一个简单接口,而系统内部的复杂性被封装在外观类后面。

2. 主要作用


  • 简化接口: 为子系统提供一个简单的接口,降低使用难度。
  • 解耦子系统: 让客户端不需要了解子系统的复杂实现,减少客户端与子系统之间的依赖。
  • 提高灵活性和扩展性: 通过外观模式实现系统的模块化,使得系统更易于扩展和维护。

3. 解决的问题


外观模式主要用来解决复杂系统的使用难题。通过提供一个统一的接口,隐藏系统的复杂性,使得客户端可以更简单地进行操作。

4. 模式原理


包含角色:

  1. 外观角色(Facade):定义了一个高层接口,提供与多个子系统的交互方法。
  2. 子系统角色(Subsystem Classes):各个子系统实现具体的功能,外观类通过这些子系统来完成用户的请求。

UML类图:
在这里插入图片描述
代码示例:

// 子系统类
class Computer {
    public void start() {
        System.out.println("Computer starting...");
    }
    public void shutdown() {
        System.out.println("Computer shutting down...");
    }
}

class Monitor {
    public void turnOn() {
        System.out.println("Monitor turning on...");
    }
    public void turnOff() {
        System.out.println("Monitor turning off...");
    }
}

class Keyboard {
    public void connect() {
        System.out.println("Keyboard connected.");
    }
    public void disconnect() {
        System.out.println("Keyboard disconnected.");
    }
}

// 外观类
class ComputerFacade {
    private Computer computer;
    private Monitor monitor;
    private Keyboard keyboard;

    public ComputerFacade() {
        this.computer = new Computer();
        this.monitor = new Monitor();
        this.keyboard = new Keyboard();
    }

    public void start() {
        keyboard.connect();
        monitor.turnOn();
        computer.start();
    }

    public void shutdown() {
        computer.shutdown();
        monitor.turnOff();
        keyboard.disconnect();
    }
}

调用.

public class FacadePatternDemo {
    public static void main(String[] args) {
        ComputerFacade computerFacade = new ComputerFacade();
        
        // 启动计算机
        computerFacade.start();
        
        // 关闭计算机
        computerFacade.shutdown();
    }
}

打印输出

Lights turned on
Engine started
Music playing
Music stopped
Engine stopped
Lights turned off

外观模式挺容易理解的,原理也很简单,像不像Java封装,把细节封装在类的内部,只给外部提供想给他的接口调用。

不知道你在开发中有没有注意,我们所使用到的大部分三方库,都通过提供一个管理类来简化用户的调用过程,其内部复杂的细节让用户感知不到,总之就是让用户用起来方便,一个字 “爽”!其原理也是运用了外观模式(Facade Pattern)的原则。所以说,如果你要开发第三方库,设计模式的运用是必不可少的,是基础也是灵魂。

经典案例:

在Java中,ApplicationContext 是一个外观类,提供了对不同Spring功能(如Bean管理、事务管理等)的简化访问。开发者可以通过它快速访问和管理Spring容器中的Beans,而不需要了解每个子系统的复杂性。

在安卓中,使用MediaPlayer播放音频时,开发者只需调用几个简单的方法,如setDataSource()prepare()start(),而不需要了解音频播放的底层实现。

5. 优缺点


优点

  • 简化使用:提供简单接口,降低学习成本。
  • 解耦合:降低客户端与子系统之间的耦合度。
  • 灵活性:方便对子系统进行修改和扩展。

缺点

  • 可能的性能问题:引入额外的调用可能增加性能开销。
  • 过度简化风险:可能导致系统功能细节的丢失。

6. 应用场景


  • 复杂系统:需要对外提供简单接口的复杂系统。
  • 第三方库使用:对复杂的第三方库进行封装。
  • 模块化开发:需要降低模块之间的依赖。

7. 总结


外观模式在简化复杂系统的使用和降低系统耦合度方面发挥了重要作用。通过提供一个高层接口,外观模式隐藏了复杂的实现细节,使得系统更加易于理解和使用。虽然存在一些潜在的性能问题,但在合理的应用场景下,外观模式能够显著提高系统的可维护性和灵活性。

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

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

相关文章

十六:Python学习笔记-- 爬虫(2)requests 模块详解

目录 安装 requests 模块 基本请求方法 GET 请求 POST 请求 PUT 请求 DELETE 请求 添加请求头: 处理查询参数: 文件上传: 常见响应状态码 访问超时 cookie的查询和设置 查询 Cookies 设置 Cookies 设置爬虫代理 小试牛刀 安装 …

QStringList 使用详解

QT开发之路 企业级开发系列文章,主要目标快速学习、完善、提升 相关技能 高效完成企业级项目开发 分享在企业中积累的实用技能和经验。 通过具体的编码过程、代码示例、步骤详解、核心内容和展示的方法解决遇到的实际问题。 转载请附上文章出处与本文链接。 QStrin…

尚硅谷 | Nginx | 学习笔记

尚硅谷 | Nginx | 学习笔记 尚硅谷Nginx教程由浅入深(一套打通丨初学者也可掌握)_哔哩哔哩_bilibili 文章目录 尚硅谷 | Nginx | 学习笔记一、Nginx相关概念1.Nginx是什么2.正向代理和反向代理正向代理反向代理 3.负载均衡和动静分离负载均衡动静分离 二…

AtCoder ABC376A-D题解

个人觉得 ABC 变得越来越难了/kk/kk/kk 比赛链接:ABC376 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,C;cin>>N>>C;for(int i1;i<N;i)cin>>T[i];int ans0,pre-1e5;for(int i1;i<N;i){if(T[i]-pre>C){…

后台管理系统的通用权限解决方案(五)SpringBoot整合hibernate-validator实现表单校验

1 hibernate-validator介绍 早期的网站&#xff0c;用户输入一个邮箱地址&#xff0c;需要将邮箱地址发送到服务端&#xff0c;服务端进行校验&#xff0c;校验成功后&#xff0c;给前端一个响应。 有了JavaScript后&#xff0c;校验工作可以放在前端去执行。那么为什么还需要…

【02基础】- RabbitMQ基础

目录 2- RabbitMQ2-1 介绍和安装安装 2-2 RabbitMQ 快速入门2-3 RabbitMQ 数据隔离 3- Java客户端3-1 快速入门AMQP快速入门&#x1f4d1;小结&#xff1a;SpringAMQP如何收发消息&#xff1f; 3-2 WorkQueues 任务模型案例-使用 WorkQueue 单队列绑定多消费者&#x1f4d1;小结…

uniapp开发【选择地址-省市区功能】,直接套用即可

一、效果展示 二、代码 <template><view><view class="user_info"><view class="item"

.NET Core WebApi第3讲:第一个WebApi项目、WebApi开发三种模型

一、.NEt Core 1、运行模板项目 1&#xff09;仍然有controllers&#xff0c;说明WebApi是基于MVC模式的&#xff0c;只是对比之下这里没有MVC中的views。 因为WebApi只会向前台发送数据&#xff0c;不会向前台发送HTML页面。 2、验证模板项目的api 1&#xff09;法1&#xf…

地球上的中国:世界地图概览

目录 地理空间数据可视化描绘地图导入Python包参数设置true自定义分段设置分段数量 绘制世界地图总结 地理空间数据可视化 地理空间数据可视化涉及将含有地理定位信息的数据转换成图形或影像形式&#xff0c;以此增强数据的理解与解析。这一方法广泛应用于诸如都市策划、生态守…

一文详解大模型推理:从基础知识到 vLLM

推理 本章正在建设中 - 一些部分已经完成&#xff0c;一些刚刚开始&#xff0c;还有许多尚未开始&#xff0c;但已经有足够多的有用部分完成&#xff0c;使其值得阅读。 术语表 CLA: 跨层注意力&#xff08;Cross-Layer Attention&#xff09;FHE: 全同态加密&#xff08;Fu…

【语音转文本新体验】Windows部署Whisper Web结合内网穿透轻松远程转录——“cpolar内网穿透”

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

深入理解HTTPS协议原理

目录 加密 对称加密 非对称加密 中间人攻击 证书 验证证书合法性 HTTPS工作原理 常见问题 HTTPS即安全超文本传输协议&#xff0c;是互联网上进行安全通信的一种重要协议。它是在HTTP的基础上增加了安全性的要求&#xff0c;通过SSL或TLS协议对数据进行加密&#xff0c…

省、市、县夜间灯光数据大全(Excel+shp数据)(1992-2022年)

夜间灯光数据&#xff0c;作为一种遥感数据&#xff0c;能够为我们揭示夜晚地球的灯光和火光分布情况。这种数据不仅能够反映人类活动的空间分布&#xff0c;还能作为经济发展、社会进步和环境变化的一个量化指标。通过分析夜间灯光的亮度和分布&#xff0c;我们可以对一个地区…

Spring三级缓存解决循环依赖?构造方法的循环依赖问题解决(原理、详细过程、面试题)

目录 1.什么是循环依赖 2.Spring三级缓存介绍 3.二级缓存可以解决循环依赖吗&#xff1f; 3.1 二级缓存解决循环依赖过程详解 4. 为什么还需要三级缓存呢&#xff1f;/Spring三级缓存的作用&#xff1f; 4.1三级缓存解决循环依赖过程详解 4.2 为什么二级缓存就不能解决代…

如何在算家云搭建LongWriter(长文创作)

一、 LongWriter 简介 在自然语言处理领域&#xff0c;随着对长文本处理需求的不断增加&#xff0c;能够高效生成长文本的语言模型变得至关重要。LongWriter 的推出正是为了打破传统语言模型在生成超长文本时的限制。LongWriter-glm4-9b 是基于glm-4-9b进行训练的&#xff0c;…

centos7 zabbix监控nginx的pv和uv和status_code

zabbix监控nginx的pv&#xff1a; pv)cat /var/log/nginx/access.log|awk {print $1}|wc -l;;zabbix-get验证&#xff1a; [rootbogon ~]# zabbix_get -s 192.168.253.231 -k pv_uv[pv] 100zabbix监控nginx的uv uv)cat /var/log/nginx/access.log|awk {print $1}|uniq -c | w…

【Oracle实验】字段为空的,无法通过排除判断

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.场景描述 需求&#xff1a;查询不是某个机构的数据。 同事SQL&#xff1a;where substr(bank_code,1,9) not in(014009001)&#xff1b; 看SQL似乎没什么问题&#xff0c;分析…

【SpringCloud】07-分布式事务与Seata

1. 分布式事务 2. Seata 3. 安装seata 配置数据库 CREATE DATABASE IF NOT EXISTS seata /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTIONN */; USE seata;------------------------------- The script used when storeM…

C++ | Leetcode C++题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMinMoves(vector<int> &machines) {int tot accumulate(machines.begin(), machines.end(), 0);int n machines.size();if (tot % n) {return -1;}int avg tot / n;int ans 0, sum 0;for (…

为什么架构设计禁止IP直连?

什么是IP直连&#xff1f; IP直连指应用程序直接在代码中硬编码IP地址&#xff0c;比如&#xff0c;连接mysql数据库的数据库链接&#xff0c;如下的定义方式&#xff0c;就属于IP直连。 这种写法在开发环境中很常见&#xff0c;但是&#xff0c;在正式生产环境中&#xff0c;…