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

【设计模式-外观】

这里写自定义目录标题

  • 定义
  • UML图
  • 角色作用
  • 代码
  • 使用场景

定义

为子系统中一组相关接口提供一致界面,定义一个高级接口,使得子系统更加容易使用。

UML图

在这里插入图片描述

角色作用

  • 外观(Facade)角色:这是外观模式的核心,它知道哪些子系统类负责处理请求,并将客户端的请求代理给适当的子系统对象。外观角色通常是单例的,以确保它在整个系统中只有一个实例,为所有客户端提供一致的服务。
  • 子系统(Subsystem)角色:可以有一个或多个子系统类,每个子系统实现了一部分特定的功能。这些子系统类通常是复杂的,并且它们之间可能存在复杂的交互关系。外观模式的目的就是要封装这些子系统的复杂性,使客户端不需要直接与这些复杂的子系统交互。

代码

子系统类
假设我们正在构建一个家庭影院系统,它包含多个子系统,如 DVD 播放器、投影仪和音响。

// DVD 播放器子系统
class DVDPlayer {public void on() {System.out.println("DVD player is on");}public void play(String movie) {System.out.println("Playing movie: " + movie);}public void off() {System.out.println("DVD player is off");}
}// 投影仪子系统
class Projector {public void on() {System.out.println("Projector is on");}public void wideScreenMode() {System.out.println("Projector is in widescreen mode");}public void off() {System.out.println("Projector is off");}
}// 音响子系统
class Stereo {public void on() {System.out.println("Stereo is on");}public void setVolume(int volume) {System.out.println("Stereo volume set to " + volume);}public void off() {System.out.println("Stereo is off");}
}

外观类
外观类将提供给客户端一个简单统一的接口来操作家庭影院系统。

// 家庭影院外观类
class HomeTheaterFacade {private DVDPlayer dvdPlayer;private Projector projector;private Stereo stereo;public HomeTheaterFacade() {dvdPlayer = new DVDPlayer();projector = new Projector();stereo = new Stereo();}public void watchMovie(String movie) {System.out.println("Get ready to watch a movie...");dvdPlayer.on();projector.on();projector.wideScreenMode();stereo.on();stereo.setVolume(10);dvdPlayer.play(movie);}public void endMovie() {System.out.println("Shutting down the movie theater...");dvdPlayer.off();projector.off();stereo.off();}
}

客户端类
客户端可以通过外观类简单地操作家庭影院系统,而无需直接与各个子系统交互。

public class FacadePatternExample {public static void main(String[] args) {HomeTheaterFacade homeTheater = new HomeTheaterFacade();homeTheater.watchMovie("The Dark Knight");homeTheater.endMovie();}
}

使用场景

  • 为复杂子系统提供复杂接口
  • 客户程序和抽象实现部分存在很大依赖性,引入facade隔离客户和子系统

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解密AI创作:提升Prompt提示词的提问技巧
  • 《Google软件测试之道》笔记
  • 软考 -- 软件设计师 -- 二轮复习(3) -- 数据结构(持续更新)
  • VMware网络配置
  • Redis的C客户端(hiredis库)使用
  • 深入解析:如何通过网络命名空间跟踪单个进程的网络活动(C/C++代码实现)
  • PostgreSQL的walsender和walreceiver进程介绍
  • ubuntu20.04/22.04/24.04 docker 容器安装方法
  • 借助大模型将文档转换为视频
  • 【测试开岗面试】知识点总结
  • JDBC笔记
  • UE5源码Windows编译、运行
  • 办了房屋抵押经营贷,空壳公司不怕被查吗?续贷不上怎么办?
  • Chrome谷歌浏览器登录账号next无反应
  • Renesas R7FA8D1BH (Cortex®-M85)控制SHT20
  • [PHP内核探索]PHP中的哈希表
  • ES6指北【2】—— 箭头函数
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android优雅地处理按钮重复点击
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS3 变换
  • CSS实用技巧
  • ERLANG 网工修炼笔记 ---- UDP
  • Fastjson的基本使用方法大全
  • JavaScript设计模式与开发实践系列之策略模式
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Mac转Windows的拯救指南
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • SQLServer之索引简介
  • Vue.js-Day01
  • Vue--数据传输
  • 高性能JavaScript阅读简记(三)
  • 构造函数(constructor)与原型链(prototype)关系
  • 警报:线上事故之CountDownLatch的威力
  • 力扣(LeetCode)965
  • 两列自适应布局方案整理
  • 判断客户端类型,Android,iOS,PC
  • 如何学习JavaEE,项目又该如何做?
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用putty远程连接linux
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 责任链模式的两种实现
  • 字符串匹配基础上
  • ​Python 3 新特性:类型注解
  • $NOIp2018$劝退记
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (13)DroneCAN 适配器节点(一)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (八)c52学习之旅-中断实验
  • (差分)胡桃爱原石
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (全注解开发)学习Spring-MVC的第三天