设计模式(结构型设计模式——代理模式)

设计模式(结构型设计模式——代理模式)

代理模式

基本定义

  • 代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。
  • 在代理模式中,“第三者”代理主要是起到一个中介的作用,它连接客户端和目标对象。

模式结构

  • Subject: 抽象角色。声明真实对象和代理对象的共同接口。
  • Proxy:代理角色。代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。
  • RealSubject :真实角色。它代表着真实对象,是我们最终要引用的对象。

代码实现

静态代理
  • 是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

  • 优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。

  • 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

Subject 抽象角色
public interface BuyHouse {void buyHouse();
}
RealSubject 抽象实现类
@Slf4j
public class BuyHouseImpl implements BuyHouse {@Overridepublic void buyHouse() {log.info("RealSubject 买房");}
}
Proxy 代理类 (1.继承于抽象类, 2.关联真实实现类)
@Slf4j
public class BuyHouseProxy implements BuyHouse {BuyHouse buyHouse;public BuyHouseProxy(BuyHouse buyHouse) {this.buyHouse = buyHouse;}@Overridepublic void buyHouse() {log.info("选择房源");log.info("洽谈价格");buyHouse.buyHouse();log.info("最终成交");}
}
Client 代理模式测试类
@Slf4j
public class StaticProxyTest {public static void main(String[] args){BuyHouse buyHouse = new BuyHouseImpl();buyHouse.buyHouse();log.info("静态代理后----------> ");BuyHouseProxy proxy = new BuyHouseProxy(buyHouse);proxy.buyHouse();}
}
输出结果

RealSubject 买房
静态代理后---------->
选择房源
洽谈价格
RealSubject 买房
最终成交

动态代理
  • 是在程序运行时通过反射机制动态创建的

  • 相对于静态代理,动态代理大大减少了我们的开发任务,同时减少了对业务接口的依赖,降低了耦合度。但是还是有一点点小小的遗憾之处,那就是它始终无法摆脱仅支持interface代理的桎梏,因为它的设计注定了这个遗憾。

Proxy 动态代理, 实现InvocationHandler接口
@Slf4j
public class DynamicProxy implements InvocationHandler {//代理类需要关联我们真实角色Object object;public DynamicProxy(Object object) {this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {log.info("选择房源");log.info("洽谈价格");//通过反射调用真实方法Object result = method.invoke(object, args);log.info("最终成交");return result;}
}
Client 动态类测试类
public class DynamicProxyTest {public static void main(String[] args) {//真实角色BuyHouse buyHouse = new BuyHouseImpl();/*** ClassLoader loader,* Class<?>[] interfaces,* invocationHandler h*/BuyHouse proxy = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(),new Class[]{BuyHouse.class},new DynamicProxy(buyHouse));proxy.buyHouse();}
}
输出结果

选择房源
洽谈价格
RealSubject 买房
最终成交

优点

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

  • 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的。

  • 代理对象可以扩展目标对象的功能

缺点

  • 由于在客户端和真实主题之间增加了代理对象,会造成请求的处理速度变慢。

  • 增加了系统的复杂度

使用场景

  • 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

  • 虚拟代理:通过使用过一个小的对象代理一个大对象。这样就可以减少系统的开销。

  • 保护代理:用来控制对真实对象的访问权限。

总结

  • 代理模式是通过使用引用代理对象来访问真实对象,在这里代理对象充当用于连接客户端和真实对象的中介者。

  • 代理模式主要用于远程代理、虚拟代理和保护代理。其中保护代理可以进行访问权限控制。

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

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

相关文章

HarmonyOS NEXT应用开发之Navigation实现多设备适配案例

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

backtrader回测股票:突破20日均线买入,跌破20日均线卖出

数据源&#xff1a;akshare 回测工具&#xff1a;backtrader 策略&#xff1a;突破20日均线买入&#xff0c;跌破20日均线卖出 代码&#xff1a; from datetime import datetime import backtrader as bt #1.9.78.123 import matplotlib.pyplot as plt #3.8.3 import aks…

单片机-点亮LED灯

[2-1] 点亮一个LED_哔哩哔哩_bilibili main()程序执行结束后&#xff0c;单片机会再次执行main()。 不断执行P20xFE;&#xff08;点亮LED灯1&#xff09; #include "reg52.h"void main() {P20xFE; //1111 1110 } 只执行一次P20xFE&#xff1b; #include "r…

数据库只追求性能是不够的!

那些成功的数据库公司没有一家是通过性能比竞争对手更快而成功的。 作者&#xff1a;JORDAN TIGANI&#xff0c;DuckDB 公司 MotherDuck 联合创始人&CEO 本文和封面来源&#xff1a;https://motherduck.com/&#xff0c;爱可生开源社区翻译。 本文约 4500 字&#xff0c;预…

论文阅读之AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

文章目录 原文链接主要内容模型图技术细节实验结果 原文链接 AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 主要内容 这篇文章的主要内容是介绍了一种新的计算机视觉模型——Vision Transformer&#xff08;ViT&#xff09;&#xff0c;这是…

【iOS ARKit】触发器与触发域

触发器 在上节的示例中&#xff0c;所有可见的物体都参与了物理模拟&#xff0c;但在一些应用中&#xff0c;我们物理模拟&#xff0c;同时又需要了解是否有物体与它们发生了碰撞。如在 AR场景中&#xff0c;当角色靠近一散门时&#xff0c;我们并不希望因为角色与门发生碰撞而…

自然语言处理学习总结

目录 1、词表示 2、语言模型&#xff08;LM&#xff09; 3、常用学习网址 自然语言处理 1、词表示 词表示&#xff1a;自然语言中最基本的语言单位表示成机器理解的方式 方式一&#xff1a;词与词之间的相似度 方式二&#xff1a;词与词之间的关系 词义的表示方法&…

云手机在海外电商中的应用优势

随着海外市场的不断拓展&#xff0c;电商行业对于高效、安全的工具需求日益增长。在这一背景下&#xff0c;云手机作为一种新型服务&#xff0c;为海外电商提供了强大的支持和便利。云手机对传统物理手机起到了非常好的延展和补充作用&#xff0c;拓展了更广泛的应用场景&#…

Kafka整理-Kafka与传统消息队列系统(如RabbitMQ, ActiveMQ)的区别是什么?

Apache Kafka与传统消息队列系统(如RabbitMQ, ActiveMQ)虽然都是处理消息和数据流的中间件,但它们在设计理念、架构、功能和使用场景方面有显著的区别。下面是Kafka与传统消息队列系统的主要区别: 1. 设计目的和使用场景 Kafka: 设计初衷是为处理大量的实时数据流。强调高…

埃隆·马斯克与OpenAI诉讼案剖析

解析马斯克与OpenAI的法律纠纷 摘要 在人工智能迅速发展的背景下&#xff0c;一场法律纠纷引起了广泛关注&#xff0c;它涉及到了理想主义与商业现实的交汇点。特斯拉创始人埃隆马斯克起诉了他共同创立的人工智能研究组织OpenAI。马斯克认为OpenAI背离了其最初的宗旨&#xf…

RabbitMQ问题

如何实现顺序消费&#xff1f; 消息放入到同一个队列中消费 如何解决消息不丢失&#xff1f; 方案&#xff1a; 如上图&#xff1a;消息丢失有三种情况&#xff0c;解决了以上三种情况就解决了丢失的问题 1、丢失1--->消息在到达交换机的时候&#xff1b;解决&#xff1…

原生html vue3使用element plus 的树tree上移下移案例源码

上效果 html源码 <!DOCTYPE html> <html lang"en"> <!-- * Name: mallSalesReports.html * Description: * Author Lani * date 2024-02-28 18:32:36 --> <head><meta charset"UTF-8"><meta name"viewport" …

docker入门(五)—— 小练习,docker安装nginx、elasticsearch

练习 docker 安装 nginx # 搜素镜像 [rootiZbp15293q8kgzhur7n6kvZ home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx …

计算机网络——协议层次及服务模型

计算机网络中的协议层次是指将网络功能划分为不同的层次&#xff0c;每个层次负责特定的功能&#xff0c;并通过协议进行通信。 一、为什么要分层 分层是设计/讨论复杂系统的有效方法。分层使得复杂系统概念化&#xff0c;结构清晰便于标示网路组件&#xff0c;以及描述其相互…

【Postrsql】postgresql的介绍、安装和使用

介绍 1.基本信息 PostgreSQL是一个功能强大的开源关系型数据库系统。经过长达15年以上的积极开发和不断改进&#xff0c;PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSQL可以运行在所有主流操作系统上&#xff0c;包括Linux、Unix和Windows…

html5cssjs代码 024 响应式布局示例

html5&css&js代码 024 响应式布局示例 一、代码二、解释 该HTML代码重点在于构建一个带有响应式设计的两栏布局网页&#xff0c;包含页头、导航条、主要内容区&#xff08;左右两列&#xff09;和底部区域&#xff0c;并运用CSS样式设置页面元素的布局、颜色、字体、间…

【Node.js从基础到高级运用】十五、单元测试与集成测试

引言 在Node.js开发过程中&#xff0c;测试是确保代码质量和功能正确性的关键步骤。单元测试和集成测试是最常见的测试类型。下面我们将使用Jest框架来进行测试。 单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证。在Node.js中&#xff0c;这通常指的是函数或者…

安卓面试题多线程 86-90

86. 请列举ThreadPoolexecutor参数配置?corePoolSize- 池中所保存的线程数,包括空闲线程。 maximumPoolSize - 池中允许的最⼤线程数。 keepAliveTime当线程数⼤于核⼼时,此为终⽌前多余的空闲线程等待新任务的最长时间。 unit - keepAliveTime 参数的时间单位。 workQueue …

HarmonyOS开发:超详细介绍如何开源静态共享包,实现远程依赖

前言 当我们开发了一个独立的功能&#xff0c;想让他人进行使用&#xff0c;一般的方式就是开源出去&#xff0c;有源码的方式&#xff0c;也有文件包的形式&#xff0c;当然了也有远程依赖的方式&#xff0c;比如在Android中&#xff0c;我们可以提供源码&#xff0c;也可以打…

SQLiteC/C++接口详细介绍sqlite3_stmt类(一)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类简介 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;二&#xff09; ​ 序言&#xff1a; 本文开始了SQLite的第二个类的详细介绍…