Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >代理模式

代理模式

作者头像
发布于 2019-04-18 08:45:15
发布于 2019-04-18 08:45:15
32700
代码可运行
举报
文章被收录于专栏:WD学习记录WD学习记录
运行总次数:0
代码可运行

代理模式:为其他对象提供一种代理以控制对对象的访问

主要解决:直接访问对象时带来的问题,比如,要访问的对象在远程机器上,有些对象由于某些原因,创建开销很大,或者操作需要安全控制,或者需要进程外的访问。直接访问会给使用者带来很多麻烦,因此可以在访问对象时加上一个对此对象的访问层。

应用实例:windows快捷方式,spring aop

优点:1 职责清晰 2 高扩展性 3 智能化

缺点:1 在客户端和真实对象之间增加了代理对象,有些类型的代理模式可能会造成请求处理速度变慢。2 实现代理模式需要额外的工作。有些代理模式的实现非常复杂。

使用场景:1. 远程代理 2. 虚拟代理 3. Copy-on-write代理 4. 保护代理(Protect or Access)5. Cache代理 6. 防火墙代理 7. 同步化代理(Synchronization) 8. 智能引用代理(smart reference)

代理模式和适配器模式的区别:适配器模式主要改变所考虑对象的接口,代理模式不能改变所代理类的接口

代理模式和装饰器模式的区别:装饰器模式是为了增强功能,代理模式是为了加以控制。

静态代理实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Movable {
    void move();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TankTimeProxy implements Movable {
    private Movable tank;

    public TankTimeProxy(Movable tank){
        this.tank=tank;
    }

    @Override
    public void move(){
        long start=System.currentTimeMillis();
        System.out.println("start time : " +start);
        tank.move();
        long end=System.currentTimeMillis();
        System.out.println("end time : "+end);
        System.out.println("spend all time :"+(end-start)/1000+"s.");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TankLogProxy implements Movable{
    private Movable tank;
    public TankLogProxy(Movable tank){
        this.tank=tank;
    }

    @Override
    public void move(){
        System.out.println("tank move start");
        tank.move();
        System.out.println("tank move end");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Movable target=new TankLogProxy(new TankTimeProxy(new Tank()));
target.move();

动态代理实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyTimeProxyInvokeHandler implements InvocationHandler {
    private Object target;

    public  MyTimeProxyInvokeHandler(Object target){
        this.target=target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
        long start=System.currentTimeMillis();
        System.out.println("start time :"+start);
        method.invoke(target,args);
        long end=System.currentTimeMillis();
        System.out.println("end time : "+end);
        System.out.println("spend all time : "+(end-start)/1000+"s.");
        return null;
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Movable tank=new Tank();
MyTimeProxyInvokeHandler myTimeProxyInvokeHandler=new MyTimeProxyInvokeHandler(tank);
Movable tankProxy=(Movable)Proxy.newProxyInstance(tank.getClass().getClassLoader(),tank.getClass().getInterfaces(),myTimeProxyInvokeHandler);
tankProxy.move();

这种方式为JDK的Proxy代理实现,目标类与代理类实现相同的接口,目标类不存在接口,只能使用CGLIB来解决。

CGLIB代理生成原理是生成目标类的子类,子类是增强过的,子类对象就是代理对象。

CGLIB实现代理模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Tank2 {
    public void move(){
        System.out.println("Tank Moving ,....");
        try{
            Thread.sleep(new Random().nextInt(5000));
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyTimeProxyInvokeHandler implements InvocationHandler {
    private Object target;

    public  MyTimeProxyInvokeHandler(Object target){
        this.target=target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
        long start=System.currentTimeMillis();
        System.out.println("start time :"+start);
        method.invoke(target,args);
        long end=System.currentTimeMillis();
        System.out.println("end time : "+end);
        System.out.println("spend all time : "+(end-start)/1000+"s.");
        return null;
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Tank2 proxyTank=new MyCglibFactory(new Tank2()).myCglibCreator();
proxyTank.move();

参考:

菜鸟教程-代理模式

代理模式

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年04月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 代理模式应用
代理模式是一种效率非常高的模式,其定义如下:提供一种代理以控制对这个对象的访问。 代理模式也叫委托模式,它是一项基本设计技巧。许多其他的设计模式,如状态模式,策略模式,访问者模式本质上是在更特殊的场合 上采用了委托模式,代理模式在日常的使用中能够提供更好的访问控制。 1: 抽象角色 抽象主题角色类可以是一个接口,是一个普通的业务类型定义,无特殊要求。 2:具体角色 也叫被委托角色,这个角色才是真正干活的角色,是业务逻辑的具体执行者 3:代理主题角色 也叫做委托类,代理类,它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实角色实现,并且在真实主题角色
用户5166556
2019/04/16
2690
设计模式——动态代理
 先写一个小程序,打印一句话"Moving",然后让主线程sleep10000毫秒以内的一个随机值
mathor
2018/09/19
4280
聊一聊java中的代理模式
我们都知道java中有23种设计模式,今天我们就来聊一聊这23种设计模式中的代理设计模式,首先代理模式其实就是控制对其他对象的访问,在访问其他对象之前我们可以进行一些其他的操作。其实代理一般分为一以下四类:
姜同学
2022/10/27
2760
【一起学系列】之代理模式:是为了控制访问啊!
【开发】:我啊,我租的房子名义上倒是房东直租,但估计还是中介,你知道吗,中介的扩张是一个必然。
Kerwin
2020/07/30
4170
【一起学系列】之代理模式:是为了控制访问啊!
Java代理和动态代理机制分析和应用
本博文中项目代码已开源下载地址:GitHub Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种。 代理模式一般涉及到的角色有4种 主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法; 真实主题:真正实现业务逻辑的类; 代理类:用来代理和封装真实主题; 客户端:使
CrazyCodeBoy
2018/05/07
7180
Java代理和动态代理机制分析和应用
Spring-AOP详解(AOP概念,原理,动态代理,静态代理)
blog.csdnimg.cn/direct/bda1b5ffb0784f6ca6e1f0da2fcfec7d.png)
用户11305962
2025/04/07
3520
Spring-AOP详解(AOP概念,原理,动态代理,静态代理)
通俗易懂的讲解一下Java的代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用(接口的引用)
李红
2019/06/18
4240
通俗易懂的讲解一下Java的代理模式
深入理解代理模式
这篇主要来将JDK动态代理底层的原理,以及有关$Proxy0、InvocationHandler相关的原理。
李红
2019/06/12
3940
深入理解代理模式
Java中的代理模式
在Java中我们最熟悉的使用场景就是SpringAOP,本篇文章即是SpringAOP源码分析的前置文章
Java学习录
2019/08/08
4910
重温java代理模式
文章关键词:java代理,jdk动态代理,cglib代理,AOP,切面编程 (由于有代码,文章格式稍乱,请多原谅包涵,代码部分,小伙伴们可以直接点击去iteye博客上看:http://qindongliang.iteye.com/blog/2247670 文中也有百度网盘源码地址可供下载!) 今天,逛技术博客时,无意间发现了一篇有关动态代理模式的文章,感觉写的不错,自己正好也在巩固下基础知识,虽然实际工作中用代理的模式的不是特别多,那是因为你使用的框架,已经帮你封装好了,所以,你可能感觉不到,但是感
我是攻城师
2018/05/14
4810
设计模式--代理模式详解
代理模式( Proxy Pattern )是指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型模式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
向着百万年薪努力的小赵
2022/12/02
3140
设计模式--代理模式详解
【设计模式】代理模式那些事儿:静态代理,动态代理,JDK的动态代理,cglib,Spring AOP
还记得上小学时候的这篇课文吗?这是我记忆深刻的一篇语文课文,哈哈,在这里提出来让大家也回忆一下小学的故事。
行百里er
2020/12/02
3130
【设计模式】代理模式那些事儿:静态代理,动态代理,JDK的动态代理,cglib,Spring AOP
Java设计模式之(五)——代理模式
说人话:在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能,比如Spring AOP。
IT可乐
2021/11/24
4130
Java设计模式之(五)——代理模式
浅谈几种设计模式--代理模式
代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。
田维常
2019/07/16
6900
浅谈几种设计模式--代理模式
设计模式-代理模式
官话上讲是一种设计模式,目的是希望代码重用。跟我们以往访问对象的方式不同,代理模式不是直接通过目标对象,而是通过代理访问我们的目标对象以及方法。因为有的时候我们无法直接与目标对象建立联系或者,我们要控制客户端访问。所以便通过代理来访问我们的真实对象。
码哥字节
2020/03/24
3740
设计模式-代理模式
Spring知识点(五)代理模式
使用代理模式的目的是为了将原来类生成一个代理类,由代理类来执行原来类的一些增强方法,但是也不影响原来类中方法的执行。
虞大大
2020/08/26
4090
Spring知识点(五)代理模式
深入理解RPC之动态代理篇
提到 JAVA 中的动态代理,大多数人都不会对 JDK 动态代理感到陌生,Proxy,InvocationHandler 等类都是 J2SE 中的基础概念。动态代理发生在服务调用方/客户端,RPC 框架需要解决的一个问题是:像调用本地接口一样调用远程的接口。于是如何组装数据报文,经过网络传输发送至服务提供方,屏蔽远程接口调用的细节,便是动态代理需要做的工作。RPC 框架中的代理层往往是单独的一层,以方便替换代理方式(如 motan 代理层位于 com.weibo.api.motan.proxy ,dubbo
kirito-moe
2018/04/27
1.6K0
代理模式
代理模式让我评价就是一个笑面虎,结构超简单,实现比较复杂。大家都知道代理模式深入咱们都业务代码中,(就是代理类把接口都实现类引入进来,然后加以封装,再由其他类使用代理类)应用场景太多了,但是大多都是静态代理,如果真都实现一个动态代理我认为还是一个比较都事情,本文对动态代理这块写对也是比较简单,
胖虎
2019/06/26
3580
代理模式
Java 代理模式
本文介绍了Java代理模式在软件开发中的应用,通过具体实例讲解了静态代理和动态代理的应用场景和实现方式。作者分别使用了JDK原生的动态代理和CGLIB动态代理来实现代理对象的创建,并分析了其实现原理和性能差异。通过本文的介绍,可以帮助开发者在实际软件开发中更好地选择使用代理模式,提高代码的灵活性和可维护性。
方志朋
2017/12/29
6380
Java 代理模式
代理模式
本章主要讲解代理模式,代理模式相信大家并不会很陌生,因为在Java的反射中很常见的使用。直接步入正吧。
@派大星
2023/06/28
1450
代理模式
相关推荐
Java 代理模式应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档