Java复习-20-接口(3)- 代理设计模式

代理设计模式(Proxy)

功能:可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。
代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
我们来思考一下这种情况,当原有的业务处理由于某种原因无法改变,而目前又需要扩展一些功能,此时可以通过代理模式实现:
在这里插入图片描述

静态代理

静态代理服务于单个接口,我们来考虑实际工程中的一个例子,现在已经有业务代码实现一个增删功能,原有的业务代码由于仍有大量程序无法改变,现在新增需求,即以后每执行一个方法输出一个日志。
我们不改变原有代码而添加一个代理来实现:

//业务接口
interface DateService {void add();void del();
}class DateServiceImplA implements DateService {@Overridepublic void add() {System.out.println("成功添加!");}@Overridepublic void del() {System.out.println("成功删除!");}
}class DateServiceProxy implements DateService {DateService server;  // 面向接口编程,而不是面向实现,给代理类持有接口而不是持有具体的类,则对于所有实现该接口的类都可以使用该代理public DateServiceProxy(DateService server){this.server = server;  // 用于接收代理的真实子类 DateServiceImplA}@Overridepublic void add() {server.add(); // 原接口抽象方法System.out.println("程序执行add方法,记录日志.");}@Overridepublic void del() {server.del();System.out.println("程序执行del方法,记录日志.");}
}//客户端
public class Test {public static void main(String[] args) {DateService service = new DateServiceProxy(new DateServiceImplA); // 向上转型,但最终实例化的对象类型还是看等号左侧最外面包的一层是什么,此处本质上就是一个代理类service.add();service.del();}
}

主要特点是:一个接口提供有两个子类,其中一个资料类是真实业务操作类,另外一个子类是代理业务操作类,能够实现的主要原因是在代理类中面向接口编程,可以覆写原接口方法时仍然调用原接口方法,然后在其上下文中增加功能——

    @Overridepublic void add() {// 上文还能加东西server.add();  // 原接口方法System.out.println("程序执行add方法,记录日志."); // 下文加东西}

这样可以不变动真实子类的情况下,实现功能的扩充,而更本质的原因是接口和实现的独立性。

动态代理

暂无,之后学了再说

参考内容

掘金社区:https://juejin.cn/post/7000214639476736013

面试题:抽象类和接口的区别

在这里插入图片描述

项目设计

在项目的设计中,接口是项目整体设计最先考虑的,因为它代表的是一个标准,事件和物体的标准,而后才是抽象类。而普通类通常是是放于最底层才考虑的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app开发小程序时ucharts图表如何使用

在此不会具体告诉大家怎么做,我只告诉大家方法: 第一步,推荐使用组件方法进行绘图,首先去官网下载这个ucharts的插件: 秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 下载完毕导入到所需要用到的项目…

数据结构与算法基础-学习-33-归并排序

目录 一、基本思想 二、算法思路 1、合并两个有序序列 2、分治法 三、算法源码 1、MergeSortTwoSortData 2、TwoWayMergeSortRecurtionSentryQueue 四、算法效率分析 五、Linux环境编译测试 六、小感慨 排序的其他相关知识点和源码分享可以参考之前的博客&#xff1a…

Docker入门,Docker是什么?有什么用?该怎么用?

目录 1. 项目部署时的复杂性? 2. Docker是如何解决依赖兼容问题的? 3. 众多Linux操作系统发行版的区别 4. Docker 是如何实现跨系统运行的? 5. Docker与虚拟机的差别 6. 镜像(Image)与容器(Container) 7. DockerHub 8. Docker 架构 …

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR显示CPU过载,该如何解决?

视频云存储/安防监控/视频汇聚平台EasyCVR基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频监控系统EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云…

Java知识总结(持续更新)

一、JDK、JRE、JVM三者之间的关系? 1. **JDK (Java Development Kit)**: JDK 是 Java 开发工具包,它包含了用于开发 Java 应用程序的所有必要工具和库。这包括 Java 编译器(javac)、Java 核心类库、开发工具&#x…

《React vs. Vue vs. Angular:2023年的全面比较》

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【LeetCode-简单题】844. 比较含退格的字符串

文章目录 题目方法一:单指针方法二:双指针方法三:栈 题目 方法一:单指针 首先每次进入循环处理之前需要对第一个字符进行判断,若是退格符,直接删掉,结束此次循环fast从0开始,如果fa…

每日一练 | 网络工程师软考真题Day32

阅读以下说明,答复以下【问题1】至【问题5】 【说明】 某公司内部效劳器S1部署了重要的应用,该应用只允许特权终端PC1访问,如图4-1所示。为保证通信平安,需要在S1上配置相应的IPSec策略。综合考虑后,确定该IPSec策略如…

pdf.js 微信公众号不显示问题

问题1: 在浏览器中能够正常显示, 但是在微信浏览器中不行!解决: 这个是pdf.js 版本问题, 用2.4版本,微信打开就没问题了 问题2: 如何关闭侧边栏? 修改这个地方, 将 -1 改…

QLineEdit 类(行编辑器)

1、 QLineEdit 类是 QWidget 类的直接子类,该类实现了一个单行的输入部件,即行编辑器; 2、验证器(QValidator 类)和输入掩码简介:主要作用是验证用户输入的字符是否符合验证器 的要求,即限制对用户的输入,比…

发UPS国际快递到墨西哥的收费标准

UPS国际快递是目前全球范围内最为知名和可靠的快递服务提供商之一,无论是个人还是企业都可以通过UPS将包裹快速送达世界各地,其中包括墨西哥。所以,对于许多人来说,了解到发UPS国际快递到墨西哥的收费标准是十分重要的。 发UPS国际…

Linux常见进程类别

目录 常见进程类别 守护进程&精灵进程 任务管理 进程组 作业 作业 | 进程组 会话 w命令 守护进程 守护进程的创建 setsid()函数 daemon()函数 模拟实现daemon函数 前台进程 | 后台进程 僵尸进程 | 孤儿进程 僵尸进程的一些细节 守护进程 | 后台进程 守护…

C++-map和set

本期我们来学习map和set 目录 关联式容器 键值对 pair 树形结构的关联式容器 set multiset map multimap 关联式容器 我们已经接触过 STL 中的部分容器,比如: vector 、 list 、 deque 、forward_list(C11)等,这些容器统称为序列式…

关于软件的功能复用

有一些人总在说软件要复用,开发一个项目时要想想怎么在另一个项目中能重用。你问他怎么做到复用,就会听到微服务、中台一些名词 复用的层次 说到复用,首先要想明白复用的是啥 级别越低,粒度越小,复用的范围越广&#…

Yolov5改进算法之添加Res2Net模块

目录 1. Res2Net介绍 1.1 Res2Net的背景和动机 1.2 Res2Net的基本概念 2. YOLOV5添加Res2Net模块 Res2Net(Residual Resolution Network)是一种用于图像处理和计算机视觉任务的深度卷积神经网络架构。它旨在解决传统的ResNet(Residual Ne…

【java】【SSM框架系列】【三】Maven进阶

目录 一、分模块开发与设计 1.1 分模块开发的意义 1.2 分模块开发(模块拆分) 二、依赖管理 2.1 依赖传递 2.2 可选依赖 2.3 排除依赖 三、聚合与继承 3.1 聚合 3.2 继承 3.3 聚合与继承的区别 四、属性管理 4.1 属性 4.1.1 属性配置与使用 …

2023 年高教社杯全国大学生数学建模竞赛题目 B 题 多波束测线问题

B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀速直线传播,在不同界面上产生反射,利用这一原理,从测量船换能器垂直向海底发射声波信号,并记录从声波发射到信号接收的传播…

智慧工地:让工地可视化、数字化、智能化

智慧工地平台功能包括:劳务管理、施工安全管理、视频监控管理、机械安全管理、危大工程监管、现场物料监管、绿色文明施工、安全隐患排查、施工综合管理、施工质量管理、设备管理、系统管理等模块。 一、项目开发环境 技术架构:微服务 开发语言&#…

数据结构--- 树

(一)知识补充 定义 树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。​ 它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点;每一个非根…

算法训练营day44|动态规划 part06:完全背包 (完全背包、 LeetCode518. 零钱兑换 II、377. 组合总和 Ⅳ )

文章目录 完全背包518. 零钱兑换 II (求组合方法数)思路分析代码实现思考总结 377. 组合总和 Ⅳ (求排列方法数)思路分析代码实现思考总结 完全背包 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。 依然举这个例子: 背包最大重量为4。 物…