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

编程-设计模式 10:外观模式

设计模式 10:外观模式

定义与目的
  • 定义:外观模式(Facade Pattern)提供了一个统一的接口,用来访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。
  • 目的:简化复杂的子系统的使用,并提供一个客户友好的接口,使得客户不必了解子系统的内部结构。
实现示例

假设我们有一个音乐播放器软件,它包含多个组件,比如播放、停止、上一首、下一首等功能。为了简化客户端代码,我们可以引入一个外观类来管理这些功能。

// 子系统接口
interface SubSystem {void execute();
}// 具体子系统 - 播放器
class Player implements SubSystem {@Overridepublic void execute() {System.out.println("Player is playing music.");}
}// 具体子系统 - 音量控制
class VolumeControl implements SubSystem {@Overridepublic void execute() {System.out.println("Volume is set to medium.");}
}// 具体子系统 - 显示器
class Display implements SubSystem {@Overridepublic void execute() {System.out.println("Display shows the current song.");}
}// 外观类
class MusicPlayerFacade {private Player player;private VolumeControl volumeControl;private Display display;public MusicPlayerFacade() {player = new Player();volumeControl = new VolumeControl();display = new Display();}public void playMusic() {player.execute();volumeControl.execute();display.execute();}
}// 客户端代码
public class Client {public static void main(String[] args) {MusicPlayerFacade facade = new MusicPlayerFacade();facade.playMusic();  // 输出: // Player is playing music.// Volume is set to medium.// Display shows the current song.}
}
使用场景
  • 当你需要提供一个简单易用的接口来访问复杂的子系统时。
  • 当子系统有很多接口,但客户端只需要访问其中的一部分时。
  • 当你需要隐藏子系统的复杂性并提供一个简单的界面时。

外观模式通过封装子系统中的复杂度,提供了一个简洁的接口供客户端使用,从而简化了客户端代码。

小结

外观模式是一种常用的结构型模式,它有助于简化子系统的使用,使得客户端不必关心子系统的具体细节,从而降低了系统的耦合度。这对于提高系统的可维护性和可扩展性非常有益。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 获取客户端真实IP
  • 以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展
  • LSPosed模块开发第一篇
  • Summernote 富文本编辑器的内容变成只读模式
  • 开源免费的wiki知识库
  • 服务器虚拟内存是什么?虚拟内存怎么设置?
  • 驰骋BPM RunSQL_Init SQL注入漏洞复现
  • 通过数组中元素或者key将数组拆分归类成新的二维数组
  • 轩轩游桂林
  • MySql-MySqlConnector
  • docker 部署 mysql8
  • 设计模式-单一职责模式
  • WPS excel 数据最小二乘法拟合
  • 4、命令式和声明式
  • Linux shell编程:监控进程CPU使用率并使用 perf 抓取高CPU进程信息
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Java 内存分配及垃圾回收机制初探
  • nginx 配置多 域名 + 多 https
  • React Native移动开发实战-3-实现页面间的数据传递
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 七牛云假注销小指南
  • 我的zsh配置, 2019最新方案
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • const的用法,特别是用在函数前面与后面的区别
  • Java数据解析之JSON
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 职场生活之道:善于团结
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #知识分享#笔记#学习方法
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Oracle)SQL优化技巧(一):分页查询
  • (苍穹外卖)day03菜品管理
  • (接口封装)
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .axf 转化 .bin文件 的方法
  • .net6使用Sejil可视化日志
  • .net程序集学习心得
  • .NET构架之我见
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET使用存储过程实现对数据库的增删改查
  • /var/spool/postfix/maildrop 下有大量文件
  • @拔赤:Web前端开发十日谈
  • @在php中起什么作用?
  • [] 与 [[]], -gt 与 > 的比较
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [AIGC] SpringBoot的自动配置解析
  • [AIGC] 深入浅出 Python中的`enumerate`函数
  • [android] 看博客学习hashCode()和equals()
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh