【设计模式-外观】

embedded/2024/9/22 16:18:31/

这里写自定义目录标题

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

定义

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

UML图

在这里插入图片描述

角色作用

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

代码

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

java">// 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");}
}

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

java">// 家庭影院外观类
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();}
}

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

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

使用场景

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

http://www.ppmy.cn/embedded/115122.html

相关文章

openEuler系统安装内网穿透工具实现其他设备公网环境远程ssh连接

目录 前言 1. 本地SSH连接测试 2. openEuler安装Cpolar 3. 配置 SSH公网地址 4. 公网远程SSH连接 5. 固定连接SSH公网地址 6. SSH固定地址连接测试 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊openEuler系统安装内网穿透工具实现其他…

某建筑市场爬虫数据采集逆向分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示:以下是本篇文章正文内容,下面…

从一个Vite Vue项目开始 - 整体设计

本篇我们将从一个基础的Vite项目开始,构建开发环境并介绍我们的整体设计思路 从一个Vite Vue项目开始项目的整体设计小结 从一个Vite Vue项目开始 vite 是一个新型的前端构建工具,能够显著的提升前端的开发构建效率,经过几年的发展逐渐的完善…

家居小程序有什么用?

家居小程序在现代家居生活中扮演着越来越重要的角色,其功能和用途广泛且实用。以下是家居小程序的主要用途: 一、商品展示与购物 商品展示:家居小程序可以展示各种家居产品,包括家具、家电、装饰品等,用户可以通过分类…

深入理解指针(5)

目录 1. sizeof和strlen 的对比 2. 数组和指针笔试题解析 3 . 指针运算笔试题解析 ——————————————————————————————————————————— 1.sizeof和strlen的对比 1.1sizeof sizeof计算变量所占内存内存空间大小的,单位是…

新产品,推出 MLX90372GVS 第三代 Triaxis® 位置传感器 IC,适用于汽车和工业系统(MLX90372GVS-ACE-308)

Triaxis 旋转和线性位置传感器IC: MLX90372GVS-ACE-103 MLX90372GVS-ACE-108 MLX90372GVS-ACE-301 MLX90372GVS-ACE-200 MLX90372GVS-ACE-208 MLX90372GVS-ACE-303 MLX90372GVS-ACE-300 MLX90372GVS-ACE-350 MLX90372GVS-ACE-100 MLX90372GVS-ACE-101 MLX90372GVS-…

【STL】 set 与 multiset:基础、操作与应用

在 C 标准库中&#xff0c;set 和 multiset 是两个非常常见的关联容器&#xff0c;主要用于存储和管理具有一定规则的数据集合。本文将详细讲解如何使用这两个容器&#xff0c;并结合实例代码&#xff0c;分析其操作和特性。 0.基础操作概览 0.1.构造&#xff1a; set<T&…

110个oracle常用函数总结

110个oracle常用函数总结 1. ascii 返回与指定的字符对应的十进制数; sql> select ascii(a) a,ascii(a) a,ascii(0) zero,ascii( ) space from dual; a a zero space --------- --------- --------- --------- 65 97 48 32 2. chr 给出整数,返回对应的字符; sql>…