《HeadFirst设计模式(第二版)》第七章代码——外观模式
代码文件目录:
Subsystem:
Amplifier
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** @Author 竹心* @Date 2023/8/8**///扬声器
public class Amplifier {int volume = 0;//音量public void on(){System.out.println("The amplifier is on!");}public void off(){System.out.println("The amplifier is off!");}public void setStreamingPlayer(){System.out.println("The amplifier setting to streamingPlayer mode!");}public void setVolume(int volume) {System.out.println("The amplifier volume is set to 5!");this.volume = volume;}public void setSurroundSound(){System.out.println("The amplifier is set to SurroundSound mode");}@Overridepublic String toString() {return "Amplifier{" +"volume=" + volume +'}';}
}
PopcornPopper
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** @Author 竹心* @Date 2023/8/8**/public class PopcornPopper {public void on(){System.out.println("The popcorn popper is on!");}public void off(){System.out.println("The popcorn popper is off!");}public void pop(){System.out.println("The popcorn popper is popping!");}@Overridepublic String toString() {return this.getClass().getSimpleName();}
}
Projector
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** @Author 竹心* @Date 2023/8/8**///投影仪
public class Projector {public void on(){System.out.println("The Projector is on!");}public void off(){System.out.println("The Projector is off!");}public void WideScreenMode(){System.out.println("The Projector is in WideScreenMode!");}@Overridepublic String toString() {return this.getClass().getSimpleName();}
}
Screen
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** @Author 竹心* @Date 2023/8/8**/public class Screen {public void up(){System.out.println("The screen going up!");}public void down(){System.out.println("The screen going down!");}@Overridepublic String toString() {return this.getClass().getSimpleName();}
}
StreamPlayer
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** @Author 竹心* @Date 2023/8/8**/public class StreamPlayer {String movie;public void on(){System.out.println("The StreamPlayer is on!");}public void off(){System.out.println("The StreamPlayer is off!");}public void pause(){System.out.println("The StreamPlayer is pausing!");}public void play(String movie){this.movie= movie;System.out.println("The StreamPlayer is playing the "+this.movie);}public void stop(){System.out.println("The StreamPlayer stops!");}@Overridepublic String toString() {return this.getClass().getSimpleName();}
}
TheaterLights
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** @Author 竹心* @Date 2023/8/8**/public class TheaterLights {public void on(){System.out.println("The theater lights are on!");}public void off(){System.out.println("The theater lights are off!");}public void dim(){//这里偷懒不将灯的亮度设置为属性了System.out.println("The theater lights are dimming to 10%");}@Overridepublic String toString() {return this.getClass().getSimpleName();}
}
HomeTheaterFacade
package Chapter7_AdapterAndFacadePattern.FacadePattern;import Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem.*;/*** @Author 竹心* @Date 2023/8/8**/public class HomeTheaterFacade {Amplifier amp;StreamPlayer player;Projector projector;TheaterLights lights;Screen screen;PopcornPopper popper;public HomeTheaterFacade(Amplifier amp,StreamPlayer player,Projector projector,TheaterLights lights,Screen screen,PopcornPopper popper) {this.amp = amp;this.player = player;this.projector = projector;this.lights = lights;this.screen = screen;this.popper = popper;}public void watchMovie(String movie){System.out.println("Get ready to watch a movie!");this.popper.on();this.popper.pop();this.lights.on();this.lights.dim();this.screen.down();this.projector.on();this.projector.WideScreenMode();this.amp.on();this.amp.setStreamingPlayer();this.amp.setSurroundSound();this.amp.setVolume(5);this.player.on();this.player.play(movie);System.out.println("Now, enjoy the movie!\n\n");}public void endMovie(){System.out.println("Shutting movie theater down!");this.popper.off();this.player.stop();this.player.off();this.amp.off();this.projector.off();this.screen.up();this.lights.off();}
}
HomeTheaterTestDrive
package Chapter7_AdapterAndFacadePattern.FacadePattern;import Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem.*;/*** @Author 竹心* @Date 2023/8/8**/public class HomeTheaterTestDrive {public static void main(String[] args) {Amplifier amplifier = new Amplifier();StreamPlayer streamPlayer = new StreamPlayer();Projector projector = new Projector();PopcornPopper popper = new PopcornPopper();TheaterLights lights = new TheaterLights();Screen screen = new Screen();HomeTheaterFacade homeTheater = new HomeTheaterFacade(amplifier,streamPlayer,projector,lights,screen,popper);homeTheater.watchMovie("Titanic");homeTheater.endMovie();}
}
notes.txt
外观模式:为子系统中的一组接口提供统一的接口。外观定义了一个更高级别的接口,使得子系统更容易被使用当用户类要通过调用一系列的组件类的接口来实现某个最终的目的的时候,可以将这些组件类的接口统合在一起,形成一个新的接口,然后客户直接调用该接口,实现解耦合。最少知识原则:一个对象只调用这些方法:对象自身的、作为参数传给方法发对象的、该方法创建或者实例化的任何对象、对象的任何组件。比如:1. return this.car.start(); 可以2. return this.car.engine.start(); 不可以优缺点:一方面减少耦合度,减低维护成本;另一方面会使得“包装者”类增加,造成复杂度和开发时间增加同时还会降低运行时的性能。
相关文章:

《HeadFirst设计模式(第二版)》第七章代码——外观模式
代码文件目录: Subsystem: Amplifier package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** Author 竹心* Date 2023/8/8**///扬声器 public class Amplifier {int volume 0;//音量public void on(){System.out.println("The amplifier …...
前端杂项-个人总结八股文的背诵方案
个人总结八股文的背诵方案 URL到显示网页的过程 浏览器解析URL,获取协议,主机名,端口号,路径等信息,并通过DNS查询将主机名转换为对应的IP地址浏览器与服务器建立TCP,进行三次握手。浏览器向服务器发送HT…...

利用 3D 地理空间数据实现Cesium的沉浸式环境
推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 为了将大量异构 3D 地理空间数据处理和分散到各行各业的地理空间应用程序和运行时引擎,Cesium 创建了 3D Tiles,这是一种用于高效流式传输和渲染大量异构数据集的开放标准。3D Tile…...

微服务——ES实现自动补全
效果展示 在搜索框根据拼音首字母进行提示 拼音分词器 和IK中文分词器一样的用法,按照下面的顺序执行。 # 进入容器内部 docker exec -it elasticsearch /bin/bash# 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch…...
北斗+5G 织就精确定位的“天罗地网”
今年,邓中亮更忙了。 外部会议,内部讨论,课题研究,还有疫情困扰期间没能出的差铆足劲似的补上,一天里,从离开床和回到床中间的时间都被工作冠名了。 北京邮电大学教授邓中亮 忙碌的加速键在2020年按下暂停…...
Ansible Roles详解
Ansible 的角色(Roles)是一种组织和管理任务和变量的方法,可以帮助您更好地组织和重用 Ansible 代码。角色是一个可重用的、自包含的 Ansible 单元,它封装了一组任务和变量,可以在不同的剧本中轻松地重用。 角色的目录…...

微服务学习笔记-基本概念
微服务是一种经过良好架构设计的分布式架构方案。根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。 微服务的架构特征: 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力&…...

Linux查看GPU显卡/CPU内存/硬盘信息
显卡信息命令/CPU内存/硬盘 1.显卡2、CPU内存3、硬盘 1.显卡 nvidia-smi nvidia-smi(显示一次当前GPU占用情况) nvidia-smi -l(每秒刷新一次并显示) watch -n 5 nvidia-smi (其中,5表示每隔6秒刷新一次终端…...
SQLAlchemy 入门:Python 中的 SQL 工具包和 ORM
SQLAlchemy 是 Python 中一款非常流行的数据库工具包,它对底层的数据库操作提供了高层次的抽象。在本篇文章中,我们将介绍 SQLAlchemy 的两个主要组成部分:SQL 工具包 (SQL Toolkit) 和对象关系映射器 (Object-Relational Mapper, ORM) 的基本…...
react Hook+antd封装一个优雅的弹窗组件
前言 在之前学vue2的时候封装过一个全局的弹窗组件,可以全局任意地方通过this调用,这次大创项目是用react技术栈,看了一下项目需求,突然发现弹窗还是比较多的,主要分为基础的弹窗以及form表单式的弹窗,如果…...

HICP学习--BGP综合小实验
需要完善 一、实验拓扑 二、实验需求 1、R2-7每台路由器均存在一个环回接口用于建立邻居,同时还存在一个环回来代表连接用户的接口;最终这些连接用户的接口网络需要可以和R1/8的环回通讯 2、AS2网段地址172.16.0.0/16 减路由条目数量 三、实验步骤 首先配置IP R…...

grafana中利用变量来添加dashboard详情页地址实现点击跳转
背景 最近弄grafana的dashboard,突然想到各个dashboard之前可以直接跳转到不同详细页面的面板,于是找了找实现方法 实现 以stat 格式的面板为例,显示出各个pod的对应状态, PromQL是(avg(kube_pod_status_phase{phase"Running", namespace!"kube-system"…...
正则表达式练习
正则表达式练习 工具目的代码运行结果 工具 pycharm 目的 https://www.77xsw.cc/fenlei/1_1/:第一页的网址 https://www.77xsw.cc/fenlei/1_2/:第二页的网址 ... https://www.77xsw.cc/fenlei/1_10/:第十页的网址 代码 import requests im…...
leetcode做题笔记73矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路一:记录行列值 void setZeroes(int** matrix, int matrixSize, int* matrixColSize){int row[matrixSize],col[*matrixColSize];fo…...

【2.1】Java微服务: Nacos的使用
目录 Nacos介绍 Nacos安装 下载和安装 修改端口 启动 服务注册与发现 导入Nacos管理依赖 导入服务依赖 配置Nacos的服务地址 启动服务,查看已注册的服务 服务分级存储模型 分级存储模型介绍 具体结构 配置实例集群 同集群优先的负载均衡策略 服务权重配置…...

vue安装及环境配置
vue安装及环境配置 1.安装 Node.js 2.配置默认安装目录和缓存日志目录 3.配置环境变量 4.配置淘宝镜像 5.安装vue和脚手架 6.创建并运行项目 1.安装 Node.js Download | Node.js 在这里👆下载的是最新版,如果要安装以前的版本👇&…...

java使用正则表达式时遇到的问题
标准的正则表达式是什么样的 Node.js(JavaScript) 在正则表达式中,斜杠(/)用来表示正则表达式的开始和结束。在JavaScript中,正则表达式可以使用斜杠包裹起来,以表示这是一个正则表达式的字面量。 在Node.js中&…...

Git介绍及常用命令详解
一、Git的概述 Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。 Git 会跟踪我们对文件所做的更改,因此我们可以记录已完成的工作,并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易&…...

赛事 | 第25届中国机器人及人工智能大赛全国决赛榜单发布
第25届中国机器人及人工智能大赛成功举办 2023年6月13日至14日,第二十五届中国机器人及人工智能大赛于海南科技职业大学成功举办。大赛由中国人工智能学会主办,共有来自清华大学、哈尔滨工业大学、中国科学技术大学、西安交通大学等500多所高校进入全国…...
JavaScript+Asp.Net MVC5同时下载多个文件
前端同时启动多个下载任务(但是没有做压缩包下载) 前端JavaScript脚本: var idList [1,2,3];//要下载的列表 $.each(idList, function (index, item) {downloadURL("/File/GetPdf?id" item); });var count 0; var downloadUR…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...