-
代理模式实现方式存在两种:继承方式及聚合方式查看全部
-
保护代理模式:保护代理模式适用于对不同的对象而言,他们所拥有的权限不尽相同查看全部
-
虚拟代理模式简单实例:加载网页时,文字和图片的展示,图片的展示在未完成之前,采用代理的图片,当完成时,则显示真正的图片查看全部
-
虚拟代理模式查看全部
-
远程代理模式查看全部
-
动态代理实现步骤查看全部
-
动态代理proxy查看全部
-
jdk动态代理查看全部
-
Proxy类 此类是负责生成动态代理的类 该类有一个静态方法: static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) 通过调用该方法来返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可以使用被代理类在接口中声明过的方法) 该方法有三个参数: loader参数:被代理类的类加载器,可以通过获取被代理类的类类型(反射),再通过Class类的getClassLoader()方法获取. interfaces参数:被代理类实现的接口,可以通过Class类的getInterfaces()方法获取.该方法返回的就是Class类型数组. h参数:事务处理器InvocationHandler的实现类.查看全部
-
动态代理 1.JDK动态代理 2.cglib动态代理 使用动态代理可以动态产生代理,实现对不同类、不同方法的代理. JDK动态代理: 动态代理就是在代理类和被代理类之间加入了实现InvocationHandler接口的类来管理代理对象的业务实现.也叫做事务处理器,像验证用户处理、日志处理都是在此处理器中来完成的. InvocationHandler接口位于java.lang.reflect包下,该接口只有一个方法. public object invoke(Object obj,Method method,Object[] args) 有三个参数 obj参数:代理对象 method参数:被代理对象方法的反射对象 args参数:被代理方法的参数 方法的返回值:调用method方法的返回值 该invoke方法会在代理类中动态调现.查看全部
-
静态代理的缺点: 使用静态代理方式实现代理模式,当不同的类都需要使用某个代理时(代理会提供某种功能),就需要创建很多的代理对象,因为代理对象与被代理对象都实现同一个接口,代理对象实现接口的方法中会调用被代理类实现接口的方法,再加上代理类自己的方法. 不同的类,它的功能方法未必一样,即接口中声明的方法未必一样. 因此代理对象不能够统一起来,必须与被代理对象耦合在一起. 使用动态代理的方式可以解决此问题.查看全部
-
使用聚合的方式实现代理,代理之间是可以互相传递与组合的. 对于刚才的例子,有两个代理,分别是提供验证用户与记录日志功能的代理.但这两个代理都只是银行的代理.即Realobj的代理. 假如在互联网行业中也需要验证用户与记录日志功能的代理.如果使用静态代理的话,那么就需要把互联网的被代理对象实现一个接口,并且两个代理对象也要分别实现该接口,代理对象实现接口的方法中调用被代理类实现接口的方法并添加额外功能. 当需要该代理的对象越来越多,那么就需要创建很多的代理对象,来分别实现对应的接口. 因为提供验证用户功能的代理与提供记录日志功能的代理都是实现相同的功能,不同的类(即行业)可能都需要用到这些功能的代理,此时可以把代理统一组合成一个代理,也就是通过一个验证用户的代理来满足各种行业上需要验证用户代理的功能.此时便需要使用动态代理的方式.查看全部
-
静态代理实现有两种方法: 1.继承法(不推荐):代理类直接继承被代理类,重写被代理类的功能方法,并添加一些额外功能.(不需要实现接口) 直接定义父类的引用指向子类对象即可. 2.聚合方法:代理类和被代理类实现相同的功能接口,并在代理类内声明一个被代理类的对象,通过构造方法进行初始化.代理类实现接口功能方法,在其方法内调用被代理类的实现方法,并添加额外功能. 直接定义接口的引用指向实现接口的代理类对象即可. 当需要为被代理对象的方法中添加更多的额外功能时,使用继承的方法就会显得很笨重.此时可以使用聚合的方式,不同的代理之间都是实现同一个接口. 因此在代理类中的成员变量类型要定义成接口的类型(聚合方式).构造方法也要改类型. 即: public class Proxyobj1 implements IComponent{ private IComponent obj; public Proxyobj(IComponent obj){ this.obj=obj; } @Override public void getMoney(){ judge(); obj.getMoney(); } public void judge(){ System.out.println("验证用户"); } } public class Proxyobj2 implements IComponent{ private IComponent obj; public Proxyobj(IComponent obj){ this.obj=obj; } @Override public void getMoney(){ log(); obj.getMoney(); } public void log(){ System.out.println("记录日志"); } } 测试类中: IComponent com1=new Proxyobj1(new Realobj()); IComponent com2=new Proxyobj2(com1); com2.getMoney(); 此时执行getMoney()方法便会先记录日志,再验证用户,再取钱.查看全部
-
静态代理:代理和被代理对象在代理之前是确定的,他们都实现相同的接口或者继承相同的抽象类. 使用静态代理的方式实现智能引用代理模式的例子: 1.被代理对象和代理对象实现同一个接口,接口声明基本的功能方法,假设接口声明一个银行取钱的方法. 2.被代理对象实现接口中银行取钱方法. 3.代理对象中,把被代理对象通过聚合的方式借助构造器添加到当前类的成员变量.代理对象有一个验证用户的方法.并实现接口的取钱方法,在实现的取钱方法中调用被代理对象的取钱方法.并且加上自己定义的验证用户方法. 4.在测试类中直接定义接口的引用指向实现接口的代理对象(添加被代理对象进构造器).此时便可以调用代理对象的取钱方法,该方法中包含着验证用户的功能. public interface IComponent{ public void getMoney(); } public class Realobj implements IComponent{ @Override public void getMoney(){ Random ran=new Randam(); //nextDouble()方法返回0~1的随机double型数据,与Math.random()方法一样. Double mon=ran.nextDouble()*10000; System.out.println("拿到了"+mon+"钱"); } } public class Proxyobj implements IComponent{ private Realobj obj; //聚合 public Proxyobj(Realobj obj){ this.obj=obj; } @Override public void getMoney(){ judge(); obj.getMoney(); } public void judge(){ System.out.println("验证用户"); } } 测试类中: IComponent obj=new Proxyobj(new Realobj); obj.getMoney();查看全部
-
代理模式实现的方式 1.静态代理 2.动态代理 静态代理与动态代理都是一种实现代理模式的方式. 聚合:一个类当中调用另一个类的对象. 聚合的体现: public class Animals{ private Dog dog; public Animals(Dog dog){ this.dog=dog; } }查看全部
举报
0/150
提交
取消