Java代理模式

来源:互联网 发布:华西附二院抢号软件 编辑:程序博客网 时间:2024/06/05 02:14

本文将从以下几个方面进行阐述:

这里写图片描述


静态代理:
其类图如下:
这里写图片描述

真实角色与代理类同时实现一个接口,真实角色只处理与它核心业务相关的,其他的全部由代理角色完成。

/** * 抽象接口 * @author sg */public interface Subject {   void printBeforeLogging();   void operation();   void printAfterLogging();}
//真实角色public class RelSubject implements Subject{    @Override    public void printBeforeLogging() {        System.out.println("RelSubject printBeforeLogging");    }    @Override    public void operation() {        System.out.println("RelSubject operation");    }    @Override    public void printAfterLogging() {        System.out.println("RelSubject printAfterLogging");    }}
//代理角色public class Proxy implements Subject{    private Subject subject;    public Proxy(Subject subject) {        super();        this.subject = subject;    }    @Override    public void printBeforeLogging() {        System.out.println("Proxy printBeforeLogging");     }    @Override    public void operation() {        //真实的角色来完成        subject.operation();    }    @Override    public void printAfterLogging() {        System.out.println("Proxy printAfterLogging");    }}
//客户端代码public class Client {    public static void main(String[] args) {        Subject subject=new RelSubject();        Subject proxy=new Proxy(subject);        proxy.printBeforeLogging();        proxy.operation();        proxy.printAfterLogging();    }}

Proxy printBeforeLogging
RelSubject operation
Proxy printAfterLogging


动态代理

public interface Calculate {    void operate();}
public class CalculateImpl implements Calculate{    @Override    public void operate() {        System.out.println("Operating");        }}
//代理类import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler{    //目标对象    private Object target;    public DynamicProxy(Object target){        this.target= target;    }    public Object getProxy(){        //调用Proxy的静态方法        return     Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),                target.getClass().getInterfaces(), this);    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Object result = method.invoke(target, args);        return result;    }}
//客户端public class Client {    public static void main(String[] args) {         Calculate target=new CalculateImpl();         Calculate proxy = (Calculate)new DynamicProxy(target).getProxy();         proxy.operate();    }}

cglib代理实现
首先下载所必须Jar包:cglib

public class CglibProxyFactory implements MethodInterceptor {    private Object target;    public CglibProxyFactory(Object target) {        super();        this.target = target;    }    public Object myCglibLogging() {        Enhancer enhancer = new Enhancer();        // 生成得代理类对象为该类的子类        enhancer.setSuperclass(target.getClass());        enhancer.setCallback(this);        return enhancer.create();    }    /**     * 调用动态方法的时候会调用此方法     */    @Override    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {        Object result = method.invoke(target, args);        System.out.println(method);        return result;    }}
//测试public class CglibProxyTest {    public static void main(String[] args) {        CglibProxyTest ct=new CglibProxyTest();        CglibProxyTest myCglibLogging = (CglibProxyTest) new CglibProxyFactory(ct).myCglibLogging();        myCglibLogging.run();    }    public void run(){        System.out.println("running");    }}

总结:
基于接口的代理方式的缺点为所要代理的应该实现接口,而基于cglib的代理如果定义为final也是无法实现的了。

原创粉丝点击