当前位置: 首页 > news >正文

设计模式: 外观模式

文章目录

  • 一、什么是外观模式
  • 二、外观模式结构
    • 1、外观模式的主要角色包括:
    • 2、外观模式通常适用于以下情况:
  • 三、优点

一、什么是外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用来访问系统中的一群接口,从而简化客户端与系统之间的交互。外观模式通过引入一个外观类来封装子系统的复杂性,使得客户端只需要与外观类交互,而无需直接与子系统的各个组件打交道。

在外观模式中,外观类充当了客户端与子系统之间的中介者,隐藏了子系统的复杂性,为客户端提供了一个更简单和统一的接口。客户端通过外观类来访问系统的功能,而不需要了解系统内部各个组件之间的关系和调用方式。

二、外观模式结构

1、外观模式的主要角色包括:

  • 外观类(Facade):对客户端提供简单接口的类,负责将客户端的请求转发给子系统中相应的对象处理。
  • 子系统(Subsystems):由多个组件或类组成的复杂系统,外观类封装了这些组件的功能。

2、外观模式通常适用于以下情况:

  • 当系统中存在复杂的子系统,需要提供一个简单统一的接口给客户端使用时。
  • 当需要将系统的各个组件解耦,减少它们之间的依赖关系时。

简单的示例:

// 子系统组件
class MusicPlayer {public void play() {System.out.println("Playing music");}
}class Amplifier {public void on() {System.out.println("Amplifier on");}public void off() {System.out.println("Amplifier off");}
}class Speaker {public void open() {System.out.println("Speaker open");}public void close() {System.out.println("Speaker close");}
}// 外观类
class AudioFacade {private MusicPlayer musicPlayer;private Amplifier amplifier;private Speaker speaker;public AudioFacade() {this.musicPlayer = new MusicPlayer();this.amplifier = new Amplifier();this.speaker = new Speaker();}public void startMusic() {amplifier.on();speaker.open();musicPlayer.play();}public void stopMusic() {musicPlayer.stop();speaker.close();amplifier.off();}
}// 客户端代码
public class Main {public static void main(String[] args) {AudioFacade audioFacade = new AudioFacade();audioFacade.startMusic();}
}

三、优点

外观模式的优点包括:

  • 简化接口:客户端只需与外观类交互,无需了解系统的复杂性。
  • 解耦客户端和子系统:外观类作为中介者,降低了客户端和子系统之间的耦合度。
  • 提高灵活性:可以随时修改外观类以适应系统变化,而不会影响客户端代码。
http://www.lryc.cn/news/323709.html

相关文章:

  • Samba局域网共享文件
  • 基于FPGA实现的UDP协议栈设计_汇总
  • maven手动上传的第三方包 打包项目报错 Could not find xxx in central 解决办法
  • 利用Scala与Apache HttpClient实现网络音频流的抓取
  • Linux(openEuler)部署SpringBoot前后端分离项目(Nginx负载均衡)
  • InnoDB 缓存
  • 目标检测——PP-YOLOE-R算法解读
  • 轻松解锁微博视频:基于Perl的下载解决方案
  • asp.net mvc 重新引导视图路径,改变视图路径
  • 《优化接口设计的思路》系列:第九篇—用好缓存,让你的接口速度飞起来
  • 专业130+总分410+西南交通大学924信号与系统考研经验西南交大电子信息通信工程,真题,大纲,参考书。
  • MySQL数据库 - 存储引擎
  • 时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测
  • Spring Cloud Alibaba Sentinel 使用详解
  • android gdb 调试
  • 分布式搜索引擎elasticsearch专栏二
  • LeetCode第一天(495.提莫攻击)
  • SQL运维_Unix下MySQL-8.0.18配置文件示例
  • python_BeautifulSoup爬取汽车评论数据
  • 24.2 SpringCloud电商进阶开发
  • ES6—Module 的语法
  • GitHub gpg体验
  • 鸿蒙一次开发,多端部署(十一)交互归一
  • 基于python+vue文学名著分享系统的设计与实现flask-django-nodejs-php
  • [音视频学习笔记]七、自制音视频播放器Part2 - VS + Qt +FFmpeg 写一个简单的视频播放器
  • LeetCode每日一题——x 的平方根
  • 2024.3.22 ARM
  • 【Linux】信号的处理{信号处理的时机/了解寄存器/内核态与用户态/信号操作函数}
  • webgl浏览器渲染设置
  • 【国家计算机二级C语言】高分笔记