设计模式: 代理模式

目录

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

二,代理模式

三,特点

四,组成部分和实现步骤

五,案例

六,应用场景


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

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

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

二,代理模式

代理模式(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.mzph.cn/news/831261.shtml

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

相关文章

数据分析--客户价值分析RFM(K-means聚类/轮廓系数)

原数据 import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn import metrics ### 数据抽取,读⼊数据 df pd.read_csv("customers1997.csv") #相对路径读取数据 print(df.info()) pr…

WPF之自定义绘图

1,创建自定义控件类 class CustomDrawnElement:FrameworkElement{public static readonly DependencyProperty BackgroundColorProperty;static CustomDrawnElement(){FrameworkPropertyMetadata meta new FrameworkPropertyMetadata(Colors.SkyBlue);meta.Affects…

Python-------实现人生重开模拟器

人生重开模拟器 代码展示:实现思路序言一、设置初始属性1.游戏标题2.属性初始化 二、设置角色性别三、设置角色出生点四、针对每一年的岁数,自动生成人生经历总结 代码展示: # 人生重开模拟器 import random import sys import timeprint(------------------------…

服务器IP选择

可以去https://ip.ping0.cc/查看IP的具体情况 1.IP位置--如果是国内用,国外服务器的话建议选择日本,香港这些比较好,因为它们离这里近,一般延时低(在没有绕一圈的情况下)。 不过GPT的话屏蔽了香港IP 2. 企…

GPT是什么?直观解释Transformer | 深度学习第5章 【3Blue1Brown 官方双语】

【官方双语】GPT是什么?直观解释Transformer | 深度学习第5章 0:00 - 预测,采样,重复:预训练/生成式/Transformer模型 3:03 - Transformer 的内部结构 6:36 - 本期总述 7:20 - 深度学习的大框架 12:27 - GPT的第一层:…

【论文浅尝】Large Language Models for Generative Information Extraction: A Survey

本文对生成式IE的LLM进行了全面的探索。使用两种分类法对现有的代表性方法进行分类: (1)众多IE子任务的分类法,旨在对可以使用llm单独或统一提取的不同类型的信息进行分类; (2)学习范式分类法,对利用llm生成IE的各种新方法进行分类。 Preliminaries o…

msmpi 高性能计算实现文件读取输入

【高性能计算】完美解决Windows下安装mpi环境并应用到VSCode中报错问题的方法_c:\program files (x86)\microsoft sdks\mpi\include/-CSDN博客 环境配置 然后跑这个代码测试即可 // 命令行参数: //mpiexec -n 9 "C:\Users\ASUS\Desktop\testMPI\MPIv2.exe&qu…

【氮化镓】GaN器件可靠性及市场前景概述

文章是关于氮化镓(GaN)场效应晶体管(FET)技术在空间应用中的可靠性、辐射效应和市场前景的概述。文章由Airbus Defence & Space的多位专家撰写,涵盖了GaN FET技术的多个关键方面,包括技术概述、可靠性问…

Find My无人机|苹果Find My技术与无人机结合,智能防丢,全球定位

无人机是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机,或者由车载计算机完全地或间歇地自主地操作。无人机按应用领域,可分为军用与民用。军用方面,无人机分为侦察机和靶机。民用方面,无人机行业应用,是无…

opencv基础篇 ——(十二)轮廓提取与绘制

opencv基础篇 ——(十二)轮廓提取与绘制 findContours轮廓提取 void void findContours( InputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset Point());功能介绍 cv::findContours 是 OpenC…

【python】商业数据聚类-回归数据分析可视化(源码+数据)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

ios CI/CD 持续集成 组件化专题四-(手动发布私有库-组件化搭建)

一 、创建私有索引库 1.1 、第一步 首先检查本地是否存在需要的私有索引库 pod repo list 例如:dp_base_ios_spec 在本地不存在该私有索引库 1.2 、第二步 在git下下创建一个新的库,这个库用来保存私有库的podspec文件,取名叫xxxSpec用以…

以更多架构核心专利,推进 SDS 产业创新创造

今天是第 24 个世界知识产权日,今年世界知识产权日活动的主题是:“知识产权和可持续发展目标:立足创新创造,构建共同未来。” 这也正是 XSKY 在软件定义存储领域的目标之一。以“数据常青”为使命的 XSKY,始终立足于软…

【MySQL | 第十篇】重新认识MySQL索引匹配过程

文章目录 10.重新认识MySQL索引匹配过程10.1匹配规则10.2举例&#xff1a;联合索引遇到范围查询&#xff08;>、<、between、like&#xff09;10.2.1例子一&#xff1a;>10.2.2例子二&#xff1a;>10.2.3例子三&#xff1a;between10.2.4例子四&#xff1a;like 10…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作&#xff0c;今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作&#xff0c;有助于更换理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

探索AIGC技术:创新、挑战与责任

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 #如何看待AIGC技术&#xff1f; 目录 AIGC简单介绍 创新 责任 未来展望和挑战 AIGC简单介绍 A…

【Linux系统】守护进程

一.进程组&#xff0c;会话 PGID&#xff1a;进程组id&#xff0c;一条命令启动的所有进程及其子进程属于同一个进程组。一条指令中最先创建的进程就是组长&#xff0c;组id就是组长的PID。./启动的SID&#xff1a;会话id&#xff0c;每次登录Linux&#xff0c;操作系统给登录的…

vue2(4)之scoped解决样式冲突/组件通信/非父子通信/ref和$refs/异步更新/.sync/事件总线/provide和inject

vue2 一、学习目标1.组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09;2.组件通信3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09;4.进阶语法 二、scoped解决样式冲突**1.默认情况**&#xff1a;2.代码演示3.scoped原理4.总结 三、data必须是一个函数…

C语言-调试技巧

目录 一、调试介绍1.1 Debug和Release的介绍1.2 Windows环境调试介绍1.2.1 学会快捷键1.2.2 查看临时变量的值1.2.3 查看内存信息1.2.4 查看调用堆栈1.2.4 查看汇编信息1.2.5 查看寄存器信息 二、编程常见的错误2.1 编译型错误2.2 链接型错误2.3 运行时错误 三、易于调试的代码…