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

《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…...

AIAgent异常处理不是加个retry就行!20年架构老兵用217次线上故障复盘,验证这6类错误必须分层隔离

第一章:AIAgent异常处理不是加个retry就行! 2026奇点智能技术大会(https://ml-summit.org) AI Agent 的异常处理常被简化为“套一层 retry 逻辑”,但这种做法在真实生产环境中极易引发级联失败、状态不一致与语义漂移。当 Agent 在多步骤任务…...

HoRain云--ASP 变量

🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…...

亲测鹿城热门短视频公司推广效果

在当今数字化时代,短视频运营拍摄行业发展迅猛,但也面临着诸多挑战。浙江一企办企业服务有限公司作为该领域的重要参与者,其技术方案和应用效果值得深入探究。行业痛点分析当前,短视频运营拍摄领域存在着一些技术挑战。行业同质化…...

负载箱的选型方法论与系统集成:从需求分析到全生命周期决策

引言在负载箱的技术讨论中,大量篇幅聚焦于设备本身的原理、设计和制造。然而,对于负载箱的用户而言,一个更为前置和关键的问题是:面对市场上数百种规格各异的产品,如何选择最适配的型号?如何将一台负载箱无…...

【奇点2026权威发布】:AIAgent任务调度必须绕开的7个LLM原生缺陷(附可验证的调度补偿算法伪代码)

第一章:【奇点2026权威发布】:AIAgent任务调度必须绕开的7个LLM原生缺陷(附可验证的调度补偿算法伪代码) 2026奇点智能技术大会(https://ml-summit.org) 大型语言模型在AIAgent任务调度中并非“即插即用”的可靠执行引擎——其底…...

面试官: Span定义及作用解析(答案深度解析)持续更新

面试题:Span 是什么?——分布式追踪中的“原子时间切片”🎯 一句话面试回答(先镇场): “Span 是分布式追踪(Distributed Tracing)中最核心的原子单元,它不是一次 HTTP 请…...

Rust的匹配中的使用规范

Rust的匹配机制是其语言设计中极具特色的一部分,它不仅提供了强大的模式匹配能力,还能在编译时确保代码的完备性和安全性。匹配(match)是Rust中处理多分支逻辑的核心工具,广泛应用于枚举解构、错误处理、条件分支等场景…...

从部署到集成:OpenStation与Roo Code构建Trae的本地AI编程闭环

1. 为什么需要本地AI编程闭环? 最近两年,AI编程助手已经成为开发者日常工作的标配工具。Trae作为一款广受欢迎的AI编程工具,其云端大模型服务确实能显著提升编码效率。但我在实际项目中发现,当遇到金融、医疗等对数据安全要求严格…...

终极语言学习革命:如何通过肌肉记忆训练重塑你的编程与英语能力?

终极语言学习革命:如何通过肌肉记忆训练重塑你的编程与英语能力? 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers …...

别再死记硬背PID公式了!用Arduino调一个温控风扇,手把手带你理解P、I、D到底在干啥

用Arduino实战PID温控:不背公式也能调出完美风扇 记得第一次接触PID控制时,盯着那三个神秘的字母——P、I、D,还有一堆让人头大的公式,感觉就像在解一道没有答案的数学题。直到我用Arduino做了一个温控风扇,亲眼看着风…...