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

设计模式--外观模式

外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个一致的界面。外观模式定义了一个高层接口,使得子系统更加容易使用。它主要用于简化复杂系统的接口,提供一个简洁的接口给客户端使用,而隐藏系统的复杂性。

外观模式的优点

  1. 简化接口:通过提供一个统一的接口,外观模式简化了子系统的使用。
  2. 降低耦合:客户端不需要了解子系统的具体实现,从而减少了客户端与子系统之间的耦合。
  3. 更好的划分访问层次:通过引入外观模式,可以让子系统内部模块更容易维护和扩展。

外观模式的结构

外观模式涉及以下角色:

  1. Facade(外观类):提供一个高层接口,供客户端调用。
  2. Subsystem classes(子系统类):一组类,它们实现子系统的功能,外观类会调用它们来完成客户端请求。

示例代码

假设我们有一个家庭影院系统,包括灯光控制、音响系统、投影仪和播放器。通过外观模式,我们可以创建一个外观类来简化这些子系统的操作。

子系统类
class Light {public void on() {System.out.println("灯光打开");}public void off() {System.out.println("灯光关闭");}
}class SoundSystem {public void on() {System.out.println("音响系统打开");}public void off() {System.out.println("音响系统关闭");}public void setVolume(int volume) {System.out.println("设置音量到 " + volume);}
}class Projector {public void on() {System.out.println("投影仪打开");}public void off() {System.out.println("投影仪关闭");}public void setInput(String input) {System.out.println("设置输入源为 " + input);}
}class Player {public void on() {System.out.println("播放器打开");}public void off() {System.out.println("播放器关闭");}public void play(String movie) {System.out.println("播放电影: " + movie);}
}
 外观类
class HomeTheaterFacade {private Light light;private SoundSystem soundSystem;private Projector projector;private Player player;public HomeTheaterFacade(Light light, SoundSystem soundSystem, Projector projector, Player player) {this.light = light;this.soundSystem = soundSystem;this.projector = projector;this.player = player;}public void watchMovie(String movie) {System.out.println("准备看电影...");light.off();soundSystem.on();soundSystem.setVolume(10);projector.on();projector.setInput("HDMI");player.on();player.play(movie);System.out.println("电影开始!");}public void endMovie() {System.out.println("关闭家庭影院系统...");light.on();soundSystem.off();projector.off();player.off();System.out.println("家庭影院系统已关闭!");}
}

客户端代码

public class FacadePatternDemo {public static void main(String[] args) {Light light = new Light();SoundSystem soundSystem = new SoundSystem();Projector projector = new Projector();Player player = new Player();HomeTheaterFacade homeTheater = new HomeTheaterFacade(light, soundSystem, projector, player);homeTheater.watchMovie("Inception");homeTheater.endMovie();}
}

输出结果

准备看电影...
灯光关闭
音响系统打开
设置音量到 10
投影仪打开
设置输入源为 HDMI
播放器打开
播放电影: Inception
电影开始!
关闭家庭影院系统...
灯光打开
音响系统关闭
投影仪关闭
播放器关闭
家庭影院系统已关闭!

解释

  1. 子系统类Light, SoundSystem, Projector, Player 分别表示家庭影院系统的各个子系统。
  2. 外观类HomeTheaterFacade 提供了简化的接口,通过组合调用子系统的方法来实现更复杂的操作,如 watchMovieendMovie
  3. 客户端FacadePatternDemo 中的客户端代码通过 HomeTheaterFacade 类来控制家庭影院系统,而不需要直接与各个子系统交互。

适用场景

  1. 简化复杂系统的使用:当一个系统非常复杂或者有很多子系统时,可以使用外观模式来提供一个简单的接口,方便客户端使用。
  2. 解耦系统与客户端:通过外观模式,客户端不需要了解系统的内部细节,从而降低系统与客户端之间的耦合度。
  3. 层次化系统设计:外观模式可以帮助你划分系统的层次,使得每一层次只与相邻的层次交互,从而提高系统的可维护性。

通过使用外观模式,我们可以隐藏系统的复杂性,提供一个简洁的接口给客户端使用,从而提高系统的可维护性和可扩展性

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Leetcode1929. 数组串联
  • 《基于 Kafka + Quartz 实现时限质控方案》
  • Hive修改表中的某个值
  • 神经网络之多层感知机
  • Symfony表单系统详解:构建强大且灵活的表单
  • 如何在Mac下修改VSCode侧边栏字体大小
  • ASPICE过程改进原则:确保汽车软件开发的卓越性能
  • Java二十三种设计模式-抽象工厂模式(3/23)
  • Web开发:ASP.NET CORE的后端小结(基础)
  • LeetCode 算法:单词搜索 c++
  • 阿里大数据面试题集锦及参考答案(持续更新)
  • IP溯源工具--IPTraceabilityTool
  • 高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0
  • 从人工巡检到智能防控:智慧油气田安全生产的新视角
  • 如何在 Vue 和 JavaScript 中截取视频任意帧图片
  • php的引用
  • CSS盒模型深入
  • E-HPC支持多队列管理和自动伸缩
  • ESLint简单操作
  • Java精华积累:初学者都应该搞懂的问题
  • Laravel 实践之路: 数据库迁移与数据填充
  • LeetCode18.四数之和 JavaScript
  • Shadow DOM 内部构造及如何构建独立组件
  • Vue2 SSR 的优化之旅
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 记录一下第一次使用npm
  • 理清楚Vue的结构
  • 入手阿里云新服务器的部署NODE
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 我这样减少了26.5M Java内存!
  • 详解NodeJs流之一
  • 项目管理碎碎念系列之一:干系人管理
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 硬币翻转问题,区间操作
  • elasticsearch-head插件安装
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • Spring Batch JSON 支持
  • 阿里云API、SDK和CLI应用实践方案
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • ###C语言程序设计-----C语言学习(6)#
  • #《AI中文版》V3 第 1 章 概述
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $nextTick的使用场景介绍
  • (windows2012共享文件夹和防火墙设置
  • (备忘)Java Map 遍历
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (十一)手动添加用户和文件的特殊权限
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (淘宝无限适配)手机端rem布局详解(转载非原创)