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

来源:互联网 发布:java中nio的用法 编辑:程序博客网 时间:2024/05/21 06:26

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


静态代理

静态代理就是在代码实现中相当于为一个委托对象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)
你好:帅牛
代理结束

原创粉丝点击