设计模式: 代理模式

目录

一,代理模式和适配器模式区别

二,代理模式

三,特点

四,组成部分和实现步骤

五,案例

六,应用场景


一,代理模式和适配器模式区别

  • 意图:代理模式控制访问并可能添加额外功能,而适配器模式转换接口以兼容。
  • 代理与对象:代理模式代理一个对象,该对象可能不存在或不希望直接访问;适配器模式转换一个已存在的不兼容对象的接口。
  • 使用场景:代理模式常用于访问控制、延迟初始化等;适配器模式常用于兼容旧系统或第三方库。
  • 接口:代理模式中,代理和实际对象通常实现相同的接口;适配器模式中,适配器实现目标接口,同时包含一个适配者的实例。

在实际应用中,选择哪种模式取决于你的具体需求。如果你需要控制对对象的访问或添加额外功能,使用代理模式;如果你需要使不兼容的接口变得兼容,使用适配器模式。

二,代理模式

代理模式(Proxy Pattern)是一种常用的软件设计模式,属于结构型模式。它为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理模式可以在不改变对象的代码的情况下,为该对象添加额外的功能,例如延迟初始化、访问控制、日志记录、缓存等。

三,特点

  1. 控制访问:代理对象可以控制对真实对象的访问,提供额外的安全检查或其他功能。

  2. 延迟初始化:代理对象可以在需要时才创建真实对象,从而实现延迟加载。

  3. 访问日志:代理对象可以记录对真实对象的访问情况,用于调试或监控。

  4. 简化接口:代理对象可以提供一个更简单的接口,隐藏真实对象的复杂性。

  5. 智能引用:代理对象可以被视为对真实对象的智能引用,它在访问真实对象之前执行额外的操作。

四,组成部分和实现步骤

代理模式的组成部分通常包括:

  • Subject(主题)接口:定义了真实对象和代理对象共有的接口。
  • Real Subject(真实主题)类:实现了主题接口的具体业务类。
  • Proxy(代理)类:也实现了主题接口,它包含对真实对象的引用,并在内部维护真实对象的生命周期。

代理模式的实现步骤通常如下:

  1. 定义Subject接口,包含业务方法。
  2. 创建RealSubject类,实现Subject接口,并实现具体的业务逻辑。
  3. 创建Proxy类,实现Subject接口,并包含一个RealSubject对象的引用。

Proxy类的方法在内部调用RealSubject对象的方法之前或之后可以添加额外的逻辑。

五,案例

// 主题接口
interface Subject {
    void request();
}

// 真实主题类
class RealSubject implements Subject {
    public void request() {
        System.out.println("真实主题处理请求");
    }
}

// 代理类
class Proxy implements Subject {
    private RealSubject realSubject;

    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.request();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request(); // 代理对象处理请求,内部委托给真实对象
    }
}

在这个示例中,Proxy 类作为代理对象,它实现了与 RealSubject 相同的 Subject 接口。客户端通过代理对象来访问真实对象的功能,而代理对象可以在内部控制对真实对象的访问。

代理模式在实际应用中非常广泛,特别是在需要控制对象访问或为对象添加额外功能的场景中。通过使用代理模式,可以在不修改真实对象的情况下,控制对象的使用,并可以在代理对象中添加额外的处理逻辑。

六,应用场景

  1. 远程代理(RMI):Java的远程方法调用(RMI)使用代理模式,允许一个Java虚拟机调用另一个Java虚拟机上的对象。代理对象作为远程对象的代理,处理所有与远程对象的交互1。

  2. Spring AOP:Spring框架中的一个核心概念是面向切面编程(AOP),它使用代理模式来实现。Spring AOP通过创建目标对象的代理对象,可以在不修改目标对象的情况下,控制横切关注点(如日志、事务管理等)的执行126。

  3. MyBatis:MyBatis框架也使用代理模式,通过创建Mapper接口的代理对象来实现对数据库的操作。当调用Mapper接口的方法时,实际上是调用了代理对象中定义的SQL语句12。

  4. 延迟初始化:在Java中,可以使用代理模式来实现延迟初始化,即在需要时才创建对象。这有助于提高应用的启动速度和性能1。

  5. 访问控制:代理对象可以在访问实际对象之前进行权限检查,确保只有拥有合适权限的用户才能访问实际对象1。

  6. 日志记录:通过代理模式,可以在访问实际对象的操作前后添加日志记录代码,实现日志功能与业务逻辑的分离1。

  7. 缓存:代理模式可以实现缓存功能,在代理对象中添加缓存逻辑,以减少对数据库的访问次数,提高系统性能1。

  8. 事务管理:在业务逻辑层,可以通过代理模式为每个业务方法自动添加事务管理代码,而无需在每个业务方法中显式编写事务代码7。

  9. 责任链模式:在处理业务流程时,代理模式可以与责任链模式结合使用,实现对请求的多个处理对象的有序访问7。

  10. 动态代理:Java提供了动态代理机制,允许在运行时动态创建代理类。这在Spring框架中尤为常见,用于在不修改原有类代码的情况下,动态地为对象添加功能

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单链表经典算法

一,移除链表元素 思路一 遍历数组,如果遇到链表中的元素等于val的节点就执行删除操作 typedef struct ListNode ListNode;struct ListNode* removeElements(struct ListNode* head, int val) {if(headNULL){return NULL;} ListNode*pnewhead(ListNode*)m…

14.集合、常见的数据结构

集合 概念 Java中的集合就是一个容器,用来存放Java对象。 集合在存放对象的时候,不同的容器,存放的方法实现是不一样的, Java中将这些不同实现的容器,往上抽取就形成了Java的集合体系。 Java集合中的根接口&#x…

MVC和DDD的贫血和充血模型对比

文章目录 架构区别MVC三层架构DDD四层架构 贫血模型代码示例 充血模型代码示例 架构区别 MVC三层架构 MVC三层架构是软件工程中的一种设计模式,它将软件系统分为 模型(Model)、视图(View)和控制器(Contro…

前端工程化03-贝壳找房项目案例JavaScript常用的js库

4、项目实战(贝壳找房) 这个项目包含,基本的ajax请求调用,内容的渲染,防抖节流的基本使用,ajax请求工具类的封装 4.1、项目的接口文档 下述接口文档: 简述内容baseURL:http://123.207.32.32…

SQL——高级教程【菜鸟教程】

SQL连接 左连接:SQL LEFT JOIN 关键字 左表相当于主表,不管与右表匹不匹配都会显示所有数据 右表就只会显示和左表匹配的内容。 //例显示:左表的name,有表的总数,时间 SELECT Websites.name, access_log.count, acc…

【机器学习-15】决策树(Decision Tree,DT)算法介绍:原理与案例实现

前言 决策树算法是机器学习领域中的一种重要分类方法,它通过树状结构来进行决策分析。决策树凭借其直观易懂、易于解释的特点,在分类问题中得到了广泛的应用。本文将介绍决策树的基本原理,包括熵和信息熵的相关概念,以及几种经典的…

上位机开发PyQt5(二)【单行输入框、多行输入框、按钮的信号和槽】

目录 一、单行输入框QLineEdit QLineEdit的方法: 二、多行输入框QTextEdit QTextEdit的方法 三、按钮QPushButton 四、按钮的信号与槽 信号与槽简介: 信号和槽绑定: 使用PyQt的槽函数 一、单行输入框QLineEdit QLineEdit控件可以输入…

双向链表专题

文章目录 目录1. 双向链表的结构2. 双向链表的实现3. 顺序表和双向链表的优缺点分析 目录 双向链表的结构双向链表的实现顺序表和双向链表的优缺点分析 1. 双向链表的结构 注意: 这⾥的“带头”跟前面我们说的“头节点”是两个概念,带头链表里的头节点…

Redis 实战1

SDS Redis 只会使用 C 字符串作为字面量, 在大多数情况下, Redis 使用 SDS (Simple Dynamic String,简单动态字符串)作为字符串表示。 比起 C 字符串, SDS 具有以下优点: 常数复杂度获取字符串…

JavaEE >> Spring MVC(2)

接上文 本文介绍如何使用 Spring Boot/MVC 项目将程序执行业务逻辑之后的结果返回给用户,以及一些相关内容进行分析解释。 返回静态页面 要返回一个静态页面,首先需要在 resource 中的 static 目录下面创建一个静态页面,下面将创建一个静态…

[嵌入式系统-53]:嵌入式系统集成开发环境大全 ( IAR Embedded Workbench(通用)、MDK(ARM)比较 )

目录 一、嵌入式系统集成开发环境分类 二、由MCU芯片厂家提供的集成开发工具 三、由嵌入式操作提供的集成开发工具 四、由第三方工具厂家提供的集成开发工具 五、开发工具的整合 5.1 Keil MDK for ARM 5.2 IAR Embedded Workbench(通用)、MDK&…

01.本地工作目录、暂存区、本地仓库三者的工作关系

1.持续集成 1.持续集成CI 让产品可以快速迭代,同时还能保持高质量。 简化工作 2.持续交付 交付 3.持续部署 部署 4.持续集成实现的思路 gitjenkins 5.版本控制系统 1.版本控制系统概述2.Git基本概述3.Git基本命令 2.本地工作目录、暂存区、本地仓库三者的工作关系…

抖音评论区精准获客自动化获客释放双手

挺好用的,评论区自动化快速获客,如果手动点引流涨,那就很耗费时间了,不是吗? 网盘自动获取 链接:https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码:0b8x

leetcode84柱状图中最大的矩形

题解&#xff1a; - 力扣&#xff08;LeetCode&#xff09; class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack new Stack<>();int maxArea Integer.MIN_VALUE;for(int i 0;i < heights.length;i){int curHeight hei…

YOLOV8添加SKATTENTION

修改ultralytics.nn.modules._init_.py https://zhuanlan.zhihu.com/p/474599120?utm_sourcezhihu&utm id0 https://blog.csdn.net/weixin 42878111/article/details/136060087 https://blog.csdn.net/gg 51511878/aricle/details/138002223 . 最后输出层不一样。

JAVA面试之MQ

如何保证消息的可靠传输&#xff1f;如果消息丢了怎么办 数据的丢失问题&#xff0c;可能出现在生产者、MQ、消费者中。 &#xff08;1&#xff09;生产者发送消息时丢失&#xff1a; ①生产者发送消息时连接MQ失败 ②生产者发送消息到达MQ后未找到Exchange(交换机) ③生产者发…

一对一WebRTC视频通话系列(一)—— 创建页面并显示摄像头画面

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一、创建html页面 简单添加input、button、video控件的布局。 <html><head><title>WebRTC demo</title></head><h1>…

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…

计算机毕业设计hadoop+spark+hive知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

黄河科技学院本科毕业设计 任务书 工 学部 大数据与计算机应用 科教中心 计算机科学与技术 专业 2018 级普本1/专升本1班 学号 学生 指导教师 毕业设计题目 基于实时音乐数据挖掘的个性化推荐系统设计与优化 毕业设计工作内容与基本…

频分复用系统设计及其MATLAB实现

引言 随着通信技术的飞速发展&#xff0c;通信系统的容量需求不断增长。频分复用&#xff08;Frequency Division Multiplexing, FDM&#xff09;作为一种重要的多路复用技术&#xff0c;被广泛应用于现代通信系统中。本文将介绍频分复用系统的设计原理&#xff0c;并展示如何…
最新文章