《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…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
