每天一点积累(七)--代理模式

代理模式分为动态代理和静态代理


静态代理

静态代理就是在代码实现中相当于为一个委托对象realSubject提供一个代理对象proxy,通过proxy可以调用realSubject的部分功能,并添加一些额外的业务处理,同时可以屏蔽realSubject中未开放的接口。


1、RealSubject 是委托类,Proxy 是代理类;
2、Subject 是委托类和代理类的接口;
3、request() 是委托类和代理类的共同方法;

具体代码实现如下:

interface Subject {
    void request(); } class RealSubject implements Subject { public void request(){ System.out.println("RealSubject"); } } class Proxy implements Subject { private Subject subject; public Proxy(Subject subject){ this.subject = subject; } public void request(){ System.out.println("begin"); subject.request(); System.out.println("end"); } } public class ProxyTest { public static void main(String args[]) { RealSubject subject = new RealSubject(); Proxy p = new Proxy(subject); p.request(); } }

静态代理实现中,一个委托类对应一个代理类,代理类在编译期间就已经确定。


动态代理

动态代理中,代理类并不是在Java代码中实现,而是在运行时期生成,相比静态代理,动态代理可以很方便的对委托类的方法进行统一处理,如添加方法调用次数、添加日志功能等等,动态代理分为jdk动态代理和cglib动态代理,下面通过一个例子看看如何实现jdk动态代理。

被代理对象

public interface Subject   
{   


public void hello(String str);
}   

public class RealSubject implements Subject{


   @Override
   public void hello(String str)
   {
       System.out.println("你好:" + str);
   }
}

代理方法

public class ProxyHandler implements InvocationHandler{
 // 这个就是我们要代理的真实对象
    private Object subject;
    
    //    构造方法,给我们要代理的真实对象赋初值
    public ProxyHandler(Object subject)
    {
        this.subject = subject;
    }
    
    @Override
    public Object invoke(Object object, Method method, Object[] args)
            throws Throwable
    {
        //  在代理真实对象前我们可以添加一些自己的操作
        System.out.println("代理模式开始");
        
        System.out.println("代理方法是" + method);
        
        //    当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        method.invoke(subject, args);
        
        //  在代理真实对象后我们也可以添加一些自己的操作
        System.out.println("代理结束");
        
        return null;
    }
    //获取代理对象 调用newProxyInstance接口
    public Object getProxy() {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Class<?>[] interfaces = subject.getClass().getInterfaces();
        return Proxy.newProxyInstance(loader, interfaces, this);
    }
}

测试

public class DynamicProxy {
 public static void main(String[] args)
   {
       //    我们要代理的真实对象
       Subject realSubject = new RealSubject();


       //    我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
       ProxyHandler handler = new ProxyHandler(realSubject);


       Subject subject=(Subject)handler.getProxy();
       subject.hello("帅牛");
   }
}


运行结果

代理模式开始
代理方法是public abstract void com.xxx.Subject.hello(java.lang.String)
你好:帅牛
代理结束

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值