秋招突击——7/5——设计模式知识点补充——适配器模式、代理模式和装饰器模式
文章目录
- 引言
- 正文
- 适配器模式
- 学习
- 篮球翻译适配器
- 面试题
- 代理模式
- 学习
- 面试题
- 装饰器模式
- 学习
- 装饰模式总结
- 面试题
- 总结
引言
- 为了一雪前耻,之前腾讯面试的极其差,设计模式一点都不会,这里找了一点设计模式的面试题,就针对几个常考的设计模式,按照学习 + 面试题 总结的方式,进行学习,今天应该是最后的几个设计模式的学习了。
- 之前的几个设计模式的学习链接如下
- 单例模式、工厂模式
- 简单工厂模式和策略模式
正文
适配器模式
学习
- 将一个类的接口转换成客户希望的另外一个接口,
- Adapter模式能够使得原本由于接口不兼容而不能一起工作的那些类能够一起工作
具体应用
- 系统的数据和行为都是正确的,但是接口不符时,应该考虑使用适配器
- 目的:使控制范围之外的一个原有对象与某个接口匹配
- 适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境不一致的情况。
类型
- 类适配器(用的少,Java实现不了):
- 通过多重继承对一个接口与另外一个接口进行匹配
- 对象适配器
对象适配器的结构图
- 具体代码实现样例
- 在上述代码中,
- target是具体需要调用的目标类
- Adaptee是需要适配的类,两者无法一块协同工作,彼此相互调用,因为接口不匹配
- 创建一个Adapater对象,继承自目标类target,创建对应需要适配的类,然后调用适配类的方法
- 客户端只需要调用的适配器就行了,可以使用目标类target的接口调用
篮球翻译适配器
- 这里截图记录一下,书中举得姚明到NBA打球的例子
- 翻译者就是适配器,他需要继承并实现球员类,也就是目标类,然后能够调用的需要适配的类的对象。
面试题
适配器模式了解吗?
- 在开发中,我们可能会使用两个类进行通信,但是他们之间的接口不同,同时又不方便修改任何一个类的接口,这个时候就需要适配器完成衔接
- 将一个类的转换成另外一个类的接口,使得原本两个不兼容的接口能够无缝完成对接。
说说适配器的模式的种类以及对应框架流程
- 类适配器
- 通过多继承实现,适配器需要同时继承并实现目标类target和被适配的类adaptee
- 对象适配器
- 同各国类对象组合实现适配,继承并实现目标类target,然后调用需要适配的类进行修改。
适配器有哪些优缺点
优点
- 提高了类的复用
- 组合若干关联对象,形成对外统一服务的接口
- 扩展性和灵活性好
缺点
- 过多使用适配器会造成代码功能和逻辑意义的混淆
- 部分语言对继承的限制,之多只能是配一个适配类
代理模式
学习
- 为其他对象提供一种代理,以控制对这个对象的访问
具体的类图
-
Subject类代理类和真实类都需要实现和共用的接口
- 两者同时实现的的话,就能同时调用共同的方法
- 两者同时实现的的话,就能同时调用共同的方法
-
RealSubject是真实的类,是实际调用的类,实现了Subject接口
-
Proxy代理类
- 保存一个引用可以让代理能够访问实体类的实例对象
- 提供一个subject接口相同的接口,就可以通过proxy来访问实体类
-
客户端代码
- 客户端要访问实体类,就需要通过代理类,可以通过代理类显示对于实体类的访问
代理模式的应用
-
远程代理
- 为一个对象在不同的地址空间提供局部代表,隐藏一个对象存在于不同地址空间的事实
- Net技术中的webservice应用,创建web引用的文件
-
虚拟代理
- 根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象
- HTML网页渲染中的图片代理,能够立刻显示文字,但是显示图片需要经过很长时间,没有图片的狂就是虚拟代理,相当于占位符,存储了真实图片的路径和尺寸
-
安全代理
- 用来控制真实对象访问时的权限
- 用于对象应该有不同的访问权限的时候
-
智能指引
- 调用真实对象是,代理处理另外一些事
面试题
什么是代理模式
- 一个中间件,解耦合服务提供者和使用者
- 使用者通过代理简洁访问服务提供者,便于后者封装和控制
- 结构性模式
静态代理和动态代理的区别
静态代理
- 特征
- 在编译期间就已经确定,需要手动编写代理类,代理类和目标类实现相同的接口
- 代理类会包含对目标对象的引用,并在代理方法中调用目标对象的相应方法
- 优点
- 结构清晰,容易理解和维护
- 编译时即可发现代码错误
- 缺点
- 接口方法多,代理类需要实现多有的方法,代码冗余
- 每次新增都需要修改接口和方法,修改代理类,维护成本高
// 接口
public interface Service {void perform();
}// 目标类
public class RealService implements Service {@Overridepublic void perform() {System.out.println("Performing service...");}
}// 代理类
public class StaticProxyService implements Service {private RealService realService;public StaticProxyService(RealService realService) {this.realService = realService;}@Overridepublic void perform() {System.out.println("Static Proxy: Before performing service...");realService.perform();System.out.println("Static Proxy: After performing service...");}
}// 使用代理
public class Main {public static void main(String[] args) {RealService realService = new RealService();StaticProxyService proxyService = new StaticProxyService(realService);proxyService.perform();}
}
动态代理
- 特征
- 在运行期间动态 生成
- 通过反射机制生成代理类,不需要手动编写代理类
- Java中通过reflect.proxy实现动态代理
- 优点
- 代理类不需要手动编写,减少代码量和维护成本
- 灵活对接口中方法进行增强
- 缺点
- 使用了反射机制,性能低于静态代理
- 动态代理代码逻辑复杂,理解调试困难
下面的代码确实复杂,没看懂
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 接口
public interface Service {void perform();
}// 目标类
public class RealService implements Service {@Overridepublic void perform() {System.out.println("Performing service...");}
}// 动态代理类
public class DynamicProxyHandler implements InvocationHandler {private Object target;public DynamicProxyHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Dynamic Proxy: Before performing service...");Object result = method.invoke(target, args);System.out.println("Dynamic Proxy: After performing service...");return result;}
}// 使用代理
public class Main {public static void main(String[] args) {RealService realService = new RealService();Service proxyService = (Service) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new DynamicProxyHandler(realService));proxyService.perform();}
}
装饰器模式
学习
装饰模式定义
- 动态给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
装饰模式的类图
- 在上述结构图中,各部分说明如下
- Component:定义一个对象接口,给这些对象动态添加职责、方法和对象
- ConcreteComponet:定义一个具体的类,可以给这个对象添加一些职责
- Decorator:装饰抽象类,继承了Componet,从外类扩展Component类的功能,对于Component来说,无需知道Decorator的存在,
感觉这里比较费劲,还得看一下这个代码是怎么实现的
Component抽象类
- 这个是具体需要执行或者说进行装饰的抽象类
ConcreteComponent类 - 是对上一个类的具体实现,也就是具体操作对象
Decorator类
- 也是一个抽象类,继承component类,需要传入一个component,然后执行component的具体的方法
ConcreteDecoratorA
- 这个是继承了Decorator类的具体的类,用来接受具体的component进行装饰,增加额外的操作
- 相当于,这里增加了一个套壳
客户端代码
- 这里需要创建对应需要修改的具体的组件对象以及抽象类对象,然后创建进行组合
本质
- 使用SetComponent来对对象进行包装,
- 每一个装饰对象的实现就和如何使用这个对象离开了,每一个装饰对象只关心自己的功能,不需要关心如何添加到对项链中
装饰模式总结
装饰模式
* 为已有功能动态添加更多功能的一种方式
对比原始方法
- 如果直接在原始的类中直接增加新的功能,会让原始的类更加复杂,而且添加的功能,一般是在某种特定情况下,才会执行的特殊行为的需要,并没有普遍性,所以不需要添加。
解决问题
- 把每一个装饰的功能,放在单独的类中,让这个类包装她所需要装饰的对象,
- 针对执行特殊行为时,客户代码就可以在运行时,有选择地、按顺序地用装饰功能包装对象了。
优点
- 将类中的装饰功能,从类中搬移出去,简化原有的类
面试题
什么时装饰器模式
- 对现有的类对象进行包裹和封装,以期望不改变类对象及其类定义的情况下,为对象添加额外的功能
- 对象结构性模式
- 通过调用被包裹后的对象完成功能添加,不直接修改现有对象的行为
装饰器模式应用场景
- 希望在不修改代码的情况下,使用对象,并且要求在运行时,为对象新增额外的行为,使用装饰模式
- 使用继承扩展对象行为的方案难以实现时,使用装饰器模式进行扩展
- 如果类已经用final修饰,如果要复用这个类对象,可以使用修饰器
总结
- 一下子又让我紧张了,下周一字节面试,我觉得基本上没戏,而且失去杭州,不过要是有机会,还是回去的,周末回来一次,也是不错的。想想就好了,我就准备了,一个半月,去面试,能进真的烧高香了。
- 现在是四点半,晚上就好好看看项目吧,准备一下简历,然后准备投递秋招的提前批了,目前关于设计模式的基本上看完了,明天可能要在收个尾,还剩下责任链模式和观察者模式,其他的基本上都不考。
- 加油!
相关文章:

秋招突击——7/5——设计模式知识点补充——适配器模式、代理模式和装饰器模式
文章目录 引言正文适配器模式学习篮球翻译适配器 面试题 代理模式学习面试题 装饰器模式学习装饰模式总结 面试题 总结 引言 为了一雪前耻,之前腾讯面试的极其差,设计模式一点都不会,这里找了一点设计模式的面试题,就针对几个常考…...

bmob Harmony鸿蒙快速开发搜索功能
搜索功能是很多应用都需要的功能。在很多平台上,要开发一个兼容性较好的搜索功能都还是需要添加比较多的视图代码的。 为了解决这个问题,鸿蒙ArkUI提供了一个快速添加搜索功能的视图组件给我们,结合Bmob Harmony鸿蒙SDK的搜索能力࿰…...

软通动力子公司鸿湖万联最新成果SwanLink AI亮相世界人工智能大会
7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议(WAIC 2024)在上海拉开帷幕,软通动力董事长兼首席执行官刘天文受邀出席开幕式。其间,软通动力携子公司鸿湖万联深度参与到大会各项活动中,并全面展…...
查看Linux系统中日志文件
Linux 系统中 Ubuntu,Debian,CentOS,RedHat 作为常用的服务器软件系统,很多人都已经熟知。不论是服务器出现问题,还是日常维护或各种环境搭建,我们经常需要登录上服务器查看日志。 如果熟知 Linux 下的 ta…...

技术干货|如何轻松完成空调管路的随机振动分析以及疲劳寿命预测
基于NVHD 的虚拟路面谱激励车内结构路噪优化 作者:戴相花 颜磊 吕霞 杨凯 单位:苏州三星电子有限公司 论文摘要 随机振动试验是评估空调管路流通振动耐久性的重要试验之一。本文以某型号空调管路系统为研究对象,评估空调管路随机振动疲劳…...
中英双语介绍中国的城市:上海市(Shanghai)
中文版 上海市是中国最大的城市之一,也是全球重要的金融、贸易和航运中心。作为一座现代化的国际大都市,上海以其繁华的商业区、丰富的文化遗产和多样化的经济结构而闻名。以下是对上海市的详细介绍,包括其地理位置、人口、经济、教育、文化…...
代码随想录算法训练营第75天:总结篇[1]
代码随想录算法训练营第75天:总结篇 代码随想录姑且是都过了一遍了,最开始了解到的时候还不会c语法,跟着学习还是有难度的,也很难坚持着去写题,后面决定加入训练营与大家齐头并进,刚开始气氛很好ÿ…...

眼动追踪技术 | 眼动的分类和模型
摘要 灵长类动物用于调整中央凹位置的正常眼动,几乎都可以归结为五种基本类型的组合:扫视、平稳追踪、聚散、前庭眼震和生理性眼震(与注视相关的微小运动)。聚散运动用于将双眼聚焦于远处的目标(深度知觉)。其他运动(如适应和聚焦)指的是眼动的非位置变…...
如何使用PHP根据输入文字动态调整图片尺寸?
根据文字改变图片尺寸的PHP代码 以下是一个使用PHP实现根据输入的文字动态调整图片尺寸的示例代码。该代码使用GD库来处理图片。 1. 创建HTML表单 首先,我们需要一个HTML表单来接受用户输入的文字和新的图片尺寸。 <!DOCTYPE html> <html lang"en…...
3.js - hdr贴图 是什么,有什么用
HDR贴图:High-Dynamic Range(高动态范围)贴图 一、定义与特点 定义:HDR贴图是具有高动态范围的环境贴图,能够捕捉并保留丰富的亮部细节和暗部细节,从而模拟出更加真实的光照效果。特点: 高动态…...

Nature Communications|用于电子皮肤的自主自愈晶体管(柔性半导体器件/电子皮肤/柔性电子)
2024年4月23日,韩国庆熙大学Jin Young Oh,美国斯坦福大学鲍哲南(Zhenan Bao)和韩国嘉泉大学Tae Il Lee团队,在《Nature Communications》上发布了一篇题为“Autonomous self-healing supramolecular polymer transistors for skin electronics”的论文。论文内容如下: 一…...

6月30日功能测试Day10
3.4.4拼团购测试点 功能位置:营销-----拼团购 后台优惠促销列表管理可以添加拼团,查看拼团活动,启动活动,编辑活动,删除活动。 可以查看拼团活动中已下单的订单以状态 需求分析 功能和添加拼团 商品拼团活动页 3…...

无人机对地面运动目标定位---获取目标的移动方向和速度
目录 一、引子 我们利用单目无人机通过等时间间隔拍照的形式对地面某移动目标进行定位,当前,我们已经获得了每张相片上该目标的三维坐标,并且知道该无人机在飞行过程中拍照的时间间隔,那么我们就可以通过一定的计算,得…...

管理才是最根本的核心竞争力
相信大家对于华为提出的“管理是核心竞争力”“管理才是企业的核心竞争力”等言论并不陌生,而华为的确也一直践行这样的理念。比如,在华为发展历史上很艰难的2002年,华为仍然坚持重点抓管理。总裁任正非后来提到:“2002年华为快崩…...
Raid阵列中硬盘损坏后,新硬盘可以直接换上吗?
RAID更换的方式基本类似,这里以RAID 1为例。 1. 关闭服务器:确保服务器或RAID控制器处于关闭或已停止状态,以避免数据写入或损坏。确定损坏硬盘:通过RAID控制器的管理界面,确定哪一块硬盘在RAID 中损坏。 2. 拆卸原硬…...

Python爬虫康复训练——笔趣阁《神魂至尊》
还是话不多说,很久没写爬虫了,来个bs4康复训练爬虫,正好我最近在看《神魂至尊》,爬个txt文件下来看看 直接上代码 """ 神魂至尊网址-https://www.bqgui.cc/book/1519/ """ import requests from b…...
Kaptcha验证码
Kaptcha验证码 Kaptcha 是一个用于生成验证码的开源库,在 Java 中使用它可以轻松地为应用程序添加验证码功能。 一、引入依赖 首先,需要在项目的 pom.xml 文件(如果是 Maven 项目)中添加 Kaptcha 的依赖: <depend…...

Rufus 制作启动盘 | 便携的工作空间
唠唠闲话 最近服务器硬盘故障多,在修复过程中,学习了一些操作,这里做个记录。本期主要介绍 U盘启动盘的制作,以及持久化存储。 U 盘启动盘 镜像选择 Ubuntu 的版本命名遵循 “Adjective Animal” 的模式,即 “形容…...
python函数参数
Python 函数参数是函数定义时用于接收传递给函数的值的变量。在Python中,函数可以有多种类型的参数,这增加了函数的灵活性和可重用性。下面是一些主要的参数类型: 1. 位置参数(Positional Arguments) 位置参数是最常…...

深入理解 XML 和 HTML 之间的区别
在现代网络技术的世界中,XML(可扩展标记语言)和 HTML(超文本标记语言) 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据,但它们在形式和用途上有显著的区别。 概述 什么是 XMLÿ…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...