外观模式的学习与使用

1、外观模式的学习

  当你在开发软件系统时,系统内部的子系统可能会变得非常复杂,包含了许多相互关联的类和接口。在使用这些子系统时,你可能需要调用多个类和方法才能完成所需的功能。这样的复杂性可能导致代码难以维护、理解和使用。外观模式旨在解决这个问题,它提供了一个简单的接口,隐藏了系统内部的复杂性,使得客户端能够更轻松地使用子系统。
  外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的接口,封装了一个或多个复杂的子系统,并使其更易于使用。外观模式将系统的复杂性隐藏在一个外观类背后,客户端只需要与外观类进行交互,无需了解底层子系统的复杂实现细节。
  外观模式通常涉及三个角色:

  • 外观(Facade):外观类是客户端与子系统之间的接口,它封装了对子系统的调用,并提供了简化的方法供客户端使用。
  • 子系统(Subsystems):子系统是完成具体功能的一组类或接口。它们负责处理外观类传递的请求,并封装了系统内部的复杂性。
  • 客户端(Client):客户端使用外观类来与子系统进行交互,它只需调用外观类提供的简化接口,而无需直接与子系统的类进行交互。
    在这里插入图片描述

2、外观模式的使用

  假设你正在开发一个音频播放器应用程序,其中包含多个模块,包括音频解码器、音频播放引擎和用户界面。你希望使用外观模式来简化客户端与这些模块的交互。
子系统

public interface AudioPlayer {/*** 音频解码器*/void audioDecoder();/*** 用户界面*/void audioSystem();/*** 音频播放引擎*/void audioPlayBackEngine();}

子系统实现类

public class AudioPlayerImpl implements AudioPlayer {@Overridepublic void audioDecoder() {System.out.println("开始解码");}@Overridepublic void audioSystem() {System.out.println("用户界面载入中");}@Overridepublic void audioPlayBackEngine() {System.out.println("音频播放引擎启动中");}
}

外观类

public class AudioPlayerFacade {private AudioPlayer audioPlayer = new AudioPlayerImpl();public void play() {audioPlayer.audioSystem();audioPlayer.audioDecoder();audioPlayer.audioPlayBackEngine();}
}

使用

public class AudioPlayerClient {public static void main(String[] args) {AudioPlayerFacade audioPlayerFacade = new AudioPlayerFacade();audioPlayerFacade.play();}
}
用户界面载入中
开始解码
音频播放引擎启动中

3、总结

外观模式的优点包括:

  • 简化客户端与子系统之间的交互,减少了客户端代码的复杂性。
  • 将系统内部的复杂性封装起来,提高了系统的可维护性和可扩展性。
  • 降低了客户端与子系统之间的耦合度,使得子系统的变化对客户端的影响降到最低。

  通过外观模式,你可以设计一个更加简洁和易于使用的接口,让客户端能够更方便地使用系统的功能,同时也保留了底层子系统的灵活性和可定制性。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音矩阵号/抖音短视频SEO矩阵系统源码开发及开发者思路分享....

抖音矩阵号短视频系统,抖音矩阵号系统源码开发,思路分享,说一点开发者掏心窝子的话...... 一套优秀的短视频获客系统,支持短视频智能剪辑、短视频定时发布,短视频排名查询及优化,短视频智能客服等,那么短视…

3D web可视化工具HOOPS Communicator与Autodesk的对比分析

越来越多的开发人员转向基于Web的2D和3D可视化和交互服务。这些使您只需使用网络浏览器即可快速向同事、客户或其他任何人展示设计。该领域的工具提供了大量功能,这些功能可能适合也可能不适合您的特定开发需求。 HOOPS Communicator的原始开发人员之一分享了对该市…

前端-css选择器

CSS选择器 水平居中 margin: 0 auto;div、p、h 需要设置元素的宽度&#xff0c;否则会自动撑满父元素 <divstyle"margin: 0 auto; width:200px; border: 1px solid #cccccc; text-align: center;" >Hello World! </div>复合选择器 后代选择器 父选择…

Spring Boot 整合视图层技术 FreeMarker

大家好&#xff01;我是今越。简单记录一下在 Spring Boot 框架中如何整合 Freemarker 及使用。 FreeMarker 简介 FreeMarker 是一款模板引擎&#xff1a;即一种基于模板和要改变的数据&#xff0c;并用来生成输出文本&#xff08; HTML 网页&#xff0c;电子邮件&#xff0c;…

vscode中ModuleNotFoundError: No module named ‘torch‘解决方法

文章目录 遇到的问题解决方法参考 遇到的问题 使用vscode训练模型&#xff0c;没有使用远程服务器&#xff0c;使用本地运行代码&#xff0c;显示“ModuleNotFoundError: No module named ‘torch’” 解决方法 这是因为没有选择合适的python解释器。如何选择正确的解释器呢&…

C语言复习笔记5

1.函数 #include<stdio.h>void Add(int *p) {(*p); }int main() {int time0;Add(&time);printf("%d\n",time);return 0; }2.二分查找 #include<stdio.h>void Add(int *p) {(*p); }int main() {int time0;Add(&time);printf("%d\n",t…

PCL点云处理之多角度剖面切割(一百九十五)

PCL点云处理之多角度切割点云剖面(一百九十五) 一、算法介绍二、具体实现1.沿法向量方向切割剖面2.沿竖直方向切割剖面3.沿水平方向切割剖面一、算法介绍 点云的剖面往往隐藏着很多有用信息,而且分析更加简单一些,这里自己实现一系列不同角度的点云剖面切割,包括沿着法向量…

Java基础学习

import java.util.*; public class task1 {//用final定义常量public static final double CM10;public static void main(String[] args) {// TODO Auto-generated method stubScanner readernew Scanner(System.in);//用Math.sqrt&#xff08;被开方数&#xff09;计算一个数值…

如何用javascript 实现条形码和二维码

条形码和二维码 条形码和二维码都是一种用于存储信息的编码系统&#xff0c;它们可以被扫描设备或图像识别设备读取。 1. 条形码&#xff1a; 由一组垂直线条组成&#xff0c;线条的粗细和间距不同可以表示不同的数字或字符。通常用于商品标识和销售管理&#xff0c;以便在商…

geoserver发布arcgis server离线瓦片

1.使用tif文件也可以发布服务&#xff0c;但是我下载的tif文件发布的服务总数模糊不清&#xff0c;原因可能是地图比例尺问题。 2.仔细研究&#xff0c;发现下载的arcgis server瓦片都是高清的&#xff0c;于是想到直接加载arcgis瓦片&#xff0c;这样图片/坐标系之间问题都完…

arcgis栅格影像--镶嵌

1、打开软件导入数据&#xff0c;如下&#xff1a; 2、在搜索栏中搜索“镶嵌至新栅格”&#xff0c;如下&#xff1a; 3、双击打开镶嵌对话框&#xff0c;如下&#xff1a; 4、点击确定按钮&#xff0c;进行栅格镶嵌&#xff0c;镶嵌结果如下&#xff1a; 5、去除黑边&#xff…

STM32F4 WiFi上传温度【ds18b20传感器、网络通信】

通过WIFI或GPRS上传温度到云端 本篇博客将介绍如何使用WIFI或GPRS模块将温度数据上传到云端。我们将涵盖连接网络的过程、上传数据的过程以及相关代码。 准备工作 在开始之前&#xff0c;我们需要准备以下材料&#xff1a; STM32F4开发板温度传感器&#xff08;例如18B20&a…