代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问

代理模式的三种实现

(1)静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.

eg

public interface PammerDao{

void domain();

}

public Target implements PammerDao{

void domain(){

System.print.outln("我是实现类")

}

}

public ProxyTarget implements PammerDao{

       private PammerDao pammerDao;

         public ProxyTarget(PammerDao pammerDao){

this.pammerDao=pammerDao;

}

     void domain(){

System.print.outln("我是实现类的代理类")

pammerDao.domain();

System.print.outln("我代理了Target类,扩展了他的domain方法")

    }

public static void main (String args[]){

            PammerDao pammerDao=new Target();

           ProxyTarget    proxy=new ProxyTarget(pammerDao);

           proxy.domain();

          }

}

静态代理的优缺点:

优点 :在不改变原有对象的前提下,使代码更加灵活,扩展。

缺点:如果接口增加方法,代理类势必会修改代码,其次 代理对象对应这一个委托对象,如果委托对象非常多,会造成很多代理对象,代码会非常臃肿。

动态代理:

特点:1 不需要实现接口

2 使用jdk的api,动态地在内存中构建代理对象。通过反射机制实现。

eg

public interface PammerDao{

void domain();

}

public Target implements PammerDao{

void domain(){

System.print.outln("我是实现类")

}

}

public ProxyTarget implements InvocationHandler{

Target target;//被代理的对象,即委托对象

public  ProxyTarget(Target target){

this.target=target;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)throws Throwable{

System.print.outln("我是实现类的代理类")

method.invoke(target,args);

System.print.outln("我代理了Target类,扩展了他的domain方法");

return null;

}

public static void main (String args[]){

            PammerDao pammerDao=new Target();

           ProxyTarget    proxy=new ProxyTarget(pammerDao);

      Proxy.newProxyInstance(pammerDao.getClass().getClassLoader,pammerDao.getClass().getInterfaces(),proxy);

           proxy.domain();

          }

}

一些动态代理的说明

(1)newProxyInstance()里面的三个参数

第一个参数,被加载对象的classLoader,不要求是实现类或者接口classloader,只要是AppClassLoader能加载到的类的classloader(即自己写的类)此处可以写成new                         Persion().calss().getClassLoader(),但是绝不能用Bootstrploader的类加载器和ExtClassLoader类加载器,否则拿到的classLoader为null。

第二个参数,被代理的方法集合,

  如果被代理对象是一个实现类:对象.getClass().getinterfaces()

  如果被代理对象是一个接口:new Class[]{interface.class}

     第三个参数,代理对象。

代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理

(2)newProxyInstance都干了些什么

复制https://www.jianshu.com/p/5478f170d9ee 这位兄弟的图片给大家说下

(3)代理类

感兴趣的同学可以把1.1.1中的字节码通过io输出到本地文件看看,可以看到代理类继承了Proxy,因为java单继承性质,所以代理类不能再继承别的类,所以JDK的动态代理只支持接口的方式代理,并不能支持具体实现类的代理。

代理模式的应用场景:

1)在以前的早已实现接口上面进行扩展

2)想要隐藏某个类的时候,可以提供代理类

3)可以实现自己的业务逻辑在 InvocationHandler的实现类里面

4) 一些框架底层频繁的使用代理模式。

(4)代理模式的缺点

java模式之一------代理模式的更多相关文章

  1. Java设计模式之代理模式(Proxy)

    前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...

  2. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  3. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  4. java设计模式之——代理模式

    1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...

  5. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  6. java jdk动态代理模式举例浅析

    代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...

  7. 谈谈Java中的代理模式

    首先来看一下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与 ...

  8. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  9. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  10. Java三种代理模式:静态代理、动态代理和cglib代理

    一.代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 简言之,代理模式就是 ...

随机推荐

  1. Python(简单计算器)

    参考:https://www.cnblogs.com/alex3714/articles/5169958.html import re ret = re.search('\([^()]+\)','(1 ...

  2. [Objective-C语言教程]类别(28)

    有时,可能会发现希望通过添加仅在某些情况下有用的行为来扩展现有类. 要向现有类添加此类扩展,Objective-C提供了类别和扩展. 如果需要向现有类添加方法,或许为了添加功能以便在应用程序中更容易地 ...

  3. 「工具」三分钟了解一款在线流程绘制工具:Whimsical

    Whimsical 是一款在线流程绘制工具,只需要一个浏览器就随时随地绘制精美的流程图.除了流程图(Flowcharts)功能,官方还推出了线框图(Wireframes).便利贴(Sticky Not ...

  4. day00 预习 ------基础数据类型预习 ,int ,str ,bool ,dict ,set ,切片,等相关

    知识点明确 1 int 2 str 3 元祖 4.列表 5. 字典 6 集合 7 布尔 1  int  数据类型 int 数据类型指的是. 数字型的内容 ,主要用于计算, 2 str 字符类型 str ...

  5. Word2Vec原理及代码

    一.Word2Vec简介 Word2Vec 是 Google 于 2013 年开源推出的一款将词表征为实数值向量的高效工具,采用的模型有CBOW(Continuous Bag-Of-Words,连续的 ...

  6. 递归实现快速幂(C++版)

    快速幂是什么? 顾名思义,快速幂就是快速算底数的n次幂.其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高. 就以a的b次方来介绍: 把b转换成二进制数,该二进制数第i位的权为 ...

  7. node-redis模块需要注意的事项

    node之中连接redis使用的redis模块,虽然好用,但是有些地方还是需要注意. npm install redis redis client 行为:1.客户端执行过程中断网的情况 由于原本连接正 ...

  8. leetcode python找不同

    给两个字符串,第二个字符串是第一个字符串乱序后再随机插入一个字母在随机的位置,需要我们找到这个字母 输入: s = "abcd" t = "abcde" 输出: ...

  9. 常见的http错误提示

    1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明100 (继续) 请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101 (切换协议 ...

  10. Java NIO学习与记录(二):FileChannel与Buffer用法与说明

    FileChannel与Buffer用法与说明 上一篇简单介绍了NIO,这一篇将介绍FileChannel结合Buffer的用法,主要介绍Buffer FileChannel的简单使用&Buf ...