关于代理的详解

 

1.  什么是代理?
在计算机程序设计的时候,我们对某些对象进行了封装。但是我们又要对封装了的对象进行操作和修改,如何在保障在不改变原有对象的情况下,实现对原始对象的操作。这里我们可以通过新建一个原始对象备份来实现对原始对象的操作。这个备份的对象我们就可以认为就是原始对象的代理。

2.  如何实现代理

通过面向接口编程,首先我们引入

l         静态代理的概念

接口:
class UserManager{

  Public void addUser(User user);

  ………

}

接口实现:
class UserManagerImpl implements UserManager{

  Public void addUser(User user){

     System.out.println(“向数据添加一个用户”);

}

  ………

}

代理类:
/**
在添加用户的时候判断用户有没有权限,有的话则做添加动作 */

//此处代理类跟原始类实现了同一个接口

Class ProxyUserManagerImpl implemets UserManager{

 Private UserManager targetUsermanager;

 //userManager进行实例化

 Public ProxyUserManagerImpl(){

     //将要进行操作的原始对象

       targetUsermanager = new UserManagerImpl();

}

Public void addUser(User user){

 //在添加对象之前进行安全检查

 checkSecurity();

 //在代理类中操作原始对象

 targetUsermanager.addUser(user);

}

 

Public void checkSecurity()

{

      System.out.println(“检查用户安全”);

}

 

 

}

 

以上程序依赖性太强,为了减少目标对象和代理对象之间的依赖。

l         动态代理

就是在程序对目标对象进行调用的时候创建目标对象的代理。

              Class ProxyDynicaUserManager implements InvocationHandler{

                     //因为不知道目标对象的类型,此处采用向上造型, 设定要操作的目标对象

                    Private Object targetObject;

                    

                    

                     //创建目标对象的代理

                     Public Object createTargetObjectInstance(Object targetObject){

                            This.targetObject = targetObject;

                            Object object =

                Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),

                                                               targetObject.getClass().getInterfaces(),

                                                               this);

                            return object;

                     }

 

                     //操作目标对象的方法

                     Public Object invoke(Object proxy,Method method,Object[] args){

                            //在调用目标对象之前,进行安全检查

checkSecurity()

 

//调用目标对象的方法

Object object = method.invoke(targetObject,args);

Return object;              

                     }

                    

                     //进行安全检查

                     Public void checkSecurity(){

                            System.out.println(“安全检查开始”);

}

              }

 

下一篇将引入AOP的概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值