Java设计模式-代理模式

情景对话玩转java设计模式 - 代理模式 最近一直在看一些框架的源码,发现到最后很多地方都用到代理,尤其是动态代理。例如SpringData jpa中EntityManager的创建过程。在23种设计模式中有一种模式就是代理模式,这里打算对这种模式整理一下,并从源码的角度分析一下对象是如何生成出来的。个人觉得这个模式是23种当中最难的一种,深研究的话需要追述到jvm,这里尽量讲明白,不足之处希望大家指正。 定义 所谓的代理,就是中介,也就是说给目标对象提供一个代理(中介)对象,并由这个中介对象去控制对目标对象的引用。这样做的好处是: 通过代理. 阅读详情

一. 概述

1. 什么是代理模式?

代理模式:提供一个代理对象来控制被代理对象的访问,在客户端和原对象之前起到中介的作用

2.为什么用代理模式?

当一个对象不适合或不能直接引用另一对象时,使用代理模式可以起到隔离作用,代理类和被代理类实现相同的接口,还可以通过代理类增加额外功能来扩展被代理类,符合代码设计的开闭原则

3.代理模式的角色?

  • 抽象主题(Subject):代理类和被代理类的共同接口
  • 具体主题(RealSubject):被代理类
  • 代理主题(Proxy):代理类

二. 代理模式

1. 静态代理

抽象主题:创建一个接口

public interface IUserDao {
	void save();
}

具体主题:创建被代理类

public class UserDao implements IUserDao {
	public void save(){
		System.out.println("保存了用户");
	}
}

代理主题:创建代理类

public class ProxyUserDao implements IUserDao {
	private IuserDao iUserDao;
	//创建构造器,初始化时传入被代理对象
	//用接口类作为构造器参数,可以传入实现此接口的任何被代理类
	public ProxyUserDao(IuserDao iUserDao){
		this.iUserDao = iUserDao;
	}
	public void save(){
		System.out.println("代理方法进行一些准备工作");
		iUserDao.save();//执行被代理类中的方法
		Sytem.out.println("代理方法进行一些后续工作")	
	}
}

测试

public class ProxyTest {
	public static void main(String[] args) {
		//1.创建被代理对象
		UserDao userDao = new UserDao();
		//2.创建代理对象,用被代理对象初始化
		ProxyUserDao proxy = new ProxyUserDao(userDao);
		proxy.save();
	}
}

执行结果

代理方法进行一些准备工作
保存了用户
代理方法进行一些后续工作
  • 优点:在不改变原类代码的前提下,对其进行功能扩展
  • 缺点:越多的扩展,导致实现相同接口的代理类增多,难以维护

2. JDK 动态代理

核心代码:Proxy.newProxyInstance(类加载器,接口,InvocationHandler)

public class ProxyFactory{
	//返回一个代理类的对象
	public static Object getProxyInstance(Object obj){
		MyInvocationHandler handler = new MyInvocationHandler(obj);
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(),//参数1:与被代理类相同的类加载器
									  obj.getClass().getInterfaces(),//参数2:与被代理类需要实现的相同接口
									  handler);//参数3:InvocationHandler,可以直接用匿名内部类
	}
}

class MyInvocationHandler implements InvocationHandler{
	
	private Object obj;
	
	public MyInvocationHandler(Object obj){
		this.obj = obj;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//(插入自定义增强代码)
		return method.invoke(obj,args);	//被代理对象中的方法
	}
}

测试

public class ProxyTest {
	public static void main(String[] args) {
		//1.创建被代理对象
		UserDao userDao = new UserDao();
		//2.创建代理对象
		IUserDao proxy = (IUserDao) ProxyFactory.getProxyInstance(userDao);
		proxy.save();	
	}
}

3. CGLIB 动态代理

对于没有接口的类,使用 CGLIB 实现动态代理
核心代码:Enhancer.create(反射类型,MethodInterceptor)

//创建拦截器
public class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("准备工作");
        Object object = methodProxy.invokeSuper(o, args);
        System.out.println("后续工作");
        return object;
    }
}
public class ProxyTest {
    public static void main(String[] args) {

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UseDao.class);
        enhancer.setCallback(new MyMethodInterceptor());

        UserDao proxy = (UserDao) enhancer.create();
        proxy.save();
    }
}
Java 24 Design Pattern 之 代理模式 代理模式 阅读详情

相关推荐

STM32CubeMX和华为LiteOS Studio开发STM32

传统的STM32的开发通常使用Keil/IAR这类开发软件,随着物联网时代的到来,传统嵌入式的发展不断向物联网方向靠拢,而Keil/IAR这类开发软件无法满足IoT一站式的开发,华为LiteOS Studio结合STM32CubeMX可以快速,高效地进行物联网开发,本文提供一种开发思路及环境的配置方法。...

weixin_45680600的博客 2832

java设计模式之 代理模式【Proxy Pattern】 详解

首先我们举个例子说明一下什么是策略模式: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代理的人能干活呀。 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的: 先定义一种类型的女人: package com.cbf4lif...

蛋蛋淡淡定的庄园 299

Fluent基于低氧舱气体交换仿真(氮气与空气混合)

一、背景概述 模拟低氧舱充氮气和排除混合气体的过程,假设注入95%的氮气,舱内原有气体为空气,压力为标准大气压,温度为300K。观察气体注入过程中,舱内平均氮气和氧气浓度的变化。 二、Fluent设置 Setup 1、General type选择压力基 绝对速度 瞬态 重力勾选 2、Model 能量方程开启 组分运输开启,设置方法如下: 选择后OK,view就会变成Edit,点击Edit。然后再次点击Edit。 将组分中的非氮气氧气和空气的气体移除,右边选项需要将空气放在最后一位。 3、Materi

qq_35535616的博客 1万+

Java开发之设计模式--代理模式(Proxy Pattern)

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。模拟场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理。Java程序: 先定义一种类型的女人: package com.zanelove.proxy; /** * I'm glad

ZaneLove's blog 1075

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 518

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2470

java设计模式之代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 模式介绍: 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些曹祖需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象

li_w_ch的博客 209

别再说Fortran过时了!手把手教你用VS Code + gfortran搭建现代开发环境(2024版)

本文打破Fortran过时的刻板印象,详细介绍如何利用VS Code和gfortran搭建现代开发环境。从编译器安装、VS Code插件配置到项目结构标准化,提供完整的2024版跨平台解决方案,并展示Fortran 2023标准的协程、并行计算等现代特性,助力科学计算与高性能开发。

weixin_42629815的博客 241

java 设计模式之代理模式

代理模式(Proxy Pattern)是一种经典的设计模式,它提供了一个代理对象来控制对另一个对象的访问。代理模式主要解决的是对象直接的业务关系,即将行为请求和行为实现分离出来,以达到增强类的功能的目的。

melck的博客 357

SLAM轨迹评估神器evo实战:从GPS到TUM格式的完整转换指南(附Python代码)

本文详细介绍了如何使用evo工具将GPS数据转换为TUM格式,以便进行SLAM轨迹评估。通过Python代码实现GPS到笛卡尔坐标的精确转换,并提供了完整的处理流程和实战案例,帮助开发者轻松完成从原始GPS数据到精确轨迹评估的全过程。特别适用于ORB-SLAM等视觉SLAM算法的性能验证。

weixin_29074295的博客 293

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

weixin_45735391的博客 8万+

Java23种设计模式之代理模式的学习

源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23种设计的模式的各种实现方式以及应用场景,非常适用于学习以及提高我们的设计思维,如果对大家有所帮助,请记得star一下给予作者一定的精神支持,你的star是我写出更好的博客的动力,谢谢大家。 代理模式(proxy pattern) 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种..

weixin_43246215的博客 2202

Synthesia技术浅析(四):自然语言处理

Synthesia 的自然语言处理(NLP)模块是其核心技术之一,涵盖了文本转语音(TTS)、情感分析以及多语言支持等多个方面。

m0_75253143的博客 1166

图解Java设计模式之代理模式

图解Java设计模式之代理模式代理模式的基本介绍静态代理模式的基本介绍应用实例静态代理优缺点动态代理模式的基本介绍JDK中生成代理对象的API动态代理应用实例 代理模式的基本介绍 1)代理模式 :为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是 :可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2)被代理的对象可以是远程对象、创建开...

不一样的花朵的博客 513

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Java设计模式】代理模式

【Java设计模式】代理模式 1、Java代理模式的基本介绍 首先得跟大家说明白,本篇文章的设计模式实现是基于Java语言的,思想还是代理的思想,不要纠结于我为什么将静态代理,动态代理,cglib代理分开来说(只能说技术是技术,思想是思想) 代理模式:为一个对象提供一个替身,以控制对这个对象的访问;即通过代理对象访问目标对象;这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能; 被代理的对象可以是远程的对象、开销大的对象或者需要被安全控制保护的对象; Java的手段实现代理模

weixin_39915192的博客 2167

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

代理模式——举例说明Java23种设计模式中的代理模式

代理模式——举例说明Java23种设计模式中的代理模式1. 概述1.1 定义1.2 组成部分2. 静态代理2.1 引出代理模式的一个简单业务场景2.2 静态代理例子1:2.3 静态代理例子2:3. 动态代理3.1 JDK代理(接口代理)3.1.1 JDK动态代理例子13.1.2 JDK动态代理例子2分析3.1.3 JDK动态代理例子33.2 Cglib 代理4. 附代码4.1 静态代理代码4.1 例子1代码4.2 例子2代码4.2 动态代理代码4.1 JDK 动态代理4.1.1 JDK 动态代理例子14.1

@素素~的博客 1990

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java设计模式之代理模式

设计模式 在说代理模式之前先说说什么是设计模式吧。 简单来说设计模式就是用来解决不同问题的一种思路。这就很好理解了,就不如说你遇到了不同的问题,每个问题都有每个问题的解决方法。 代理模式 既然设计模式是用来解决不同问题的,那么接下来就来讲讲代理模式主要是用来解决什么问题的吧。 代理模式的意义在于能够帮助被代理对象做更多的事情,而不去破坏原先的代码结构。这里主要是在特定的业务环境中...

qq_40585236的博客 285

Java设计模式——代理模式

Java设计模式——代理模式 一、代理模式的特点:两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作。(两个子类实现一个接口,一个类干事情,另一个类辅助它干事情) 二、代理模式的实例:   1、接口:买电脑   2、真实主题类:你要买电脑   3、代理类:代购 三、代理模式的应用:Spring-AOP ...

xiaoaxiao 336

JAVA设计模式——代理模式

JAVA设计模式——代理模式 一.主要概念 1.定义 代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用 代理对象启到一个中介作用,它用于连接客户端和目标对象 2.静态代理与动态代理 (1)静态代理 由程序员创建代理类,在程序运行之前,该类就被编译了 优点 方便对目标对象进行功能扩展 缺点 系统新增一个服务,就需要新增一个代理对象!重用性不强 (2)动态代理 动态代理:在程...

a158s168的博客 210

【Java】设计模式——单例、工厂、代理模式

本文介绍了Java中三种常见设计模式:单例模式确保类只有一个实例,分为饿汉式(启动即初始化)和懒汉式(首次访问初始化);工厂模式通过工厂类创建对象,实现创建与使用分离,支持灵活扩展;代理模式通过代理类控制对实际对象的访问,实现权限检查等功能。这些模式各有适用场景,合理运用能提升代码的可维护性和扩展性。文章通过具体代码示例展示了每种模式的实现方式,帮助开发者理解设计模式的核心思想与应用方法。

user340的博客 2520
上一篇: MySQL-my.ini配置
下一篇: Java-Spring-IOC
codfishXY
博客等级 码龄9年 25粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值