java模式之一

Wesley13
• 阅读 706

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

代理模式的三种实现

(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 这位兄弟的图片给大家说下

java模式之一

(3)代理类

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

代理模式的应用场景:

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

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

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

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

(4)代理模式的缺点

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
JDK动态代理和Cglib的动态代理
最简单的是静态代理方法,即代理模式,这里就不多啰嗦了。。重点说一下JDK的动态代理和Cglib的动态代理吧先说JDK的,需要被代理的类需要有接口,否则无法实现package proxy.dynamic;public interface IBook {void add();}实现接口
Easter79 Easter79
3年前
Spring的两种代理JDK和CGLIB的区别浅谈
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Easter79 Easter79
3年前
Spring的两种动态代理:Jdk和Cglib 的区别和实现
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
3年前
JDK动态代理的简单实现
1\.先理一下动态代理实现的思路:    实现功能:自己定义一个类Proxy,通过Proxy的静态方法newProxyInstance(Class<Tintface,InvocationHandlerh)返回代理对象, intface:被代理类的接口对象, h:InvocationHandler的实例对象    1).声明一段动
Wesley13 Wesley13
3年前
Java动态代理机制解析
动态代理是指在运行时动态生成代理类。不需要我们像静态代理那个去手动写一个个的代理类。生成动态代理类有很多方式:Java动态代理,CGLIB,Javassist,ASM库等。这里主要说一下Java动态代理的实现。Java动态代理InvocationHandler接口Java动态代理中,每一个
Wesley13 Wesley13
3年前
Java中jdk代理和cglib代理
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中代理模式从实现方式上可以分为两个类别:静态代理和动态代理静态代理:也就是我们学习设计模式之代理模式时常见的事例,具体不在赘述,参见:
Wesley13 Wesley13
3年前
Java代理模式的实现方式
代理模式是23种设计模式之一,定义为:为其他对象提供一种代理以控制对这个对象的访问。简单来说就是在调用方无感知的情况下,修改原有的行为。\TOC\静态代理即通过手动编码方式实现publicinterfaceIFooService{voidfoo();}publicclass
待兔 待兔
4个月前
Java设计模式之 - 代理模式
代理模式的介绍:代理模式也称为委托模式,在开发中经常用到,是编程的好帮手,在日常生活中也比较常见。比如公司中午让同事帮忙带一份饭,比如我们请一个律师打官司,比如我们用代理服务器上网等等。代理模式真是无处不在。代理模式的定义:为其它对象提供一种代理以控制对这