【设计模式学习】代理模式

=======================================静态代理==============================

package Proxy.StaticProxy;


/**
 * 静态代理  
 * @author DMW
 * @2019年1月17日
 */
public class Main {
    
    /**
     * 可用于,某个方法,某个服务,只负责主要任务
     * 但是在这之前,需要一些提前准备,这样可以使用代理,
     * 由代理把之前的准备工作做完,主要任务由主要服务做 
     */
    
    /**
     * 需要
     * 1.interface ---->一个接口,规定这个业务的整体业务,包括主业务和前置任务
     * 2.service   ---->一个类,实现interface,此类负责主要任务,前置任务不用管
     * 3.proxy       ---->一个类,实现interface,有一个service属性,构造方法需要传这个service,
     *                     此类完成 前置任务,主要任务由属性service完成
     */
    public static void main(String[] args) {
        ProxyInterface beProxy =new BeProxyed();
        ProxyInterface proxy =new Proxy(beProxy);
        
        proxy.doSomething1();
        proxy.doSomething2();
        proxy.proxyMethod();
    }
}
 

package Proxy.StaticProxy;

/**
 * 被代理的类
 */
public class BeProxyed implements ProxyInterface{

    @Override
    public void doSomething1() {
        System.out.println("我是被代理类,doSomething1不是我该做的");
    }

    @Override
    public void doSomething2() {
        System.out.println("我是被代理类,doSomething2不是我该做的");
    }

    @Override
    public void proxyMethod() {
        System.out.println("我是被代理类,proxyMethod是我应该做的");
    }

}
 

package Proxy.StaticProxy;

/**
 * 代理接口
 * @author DMW
 * @2019年1月17日
 */
public interface ProxyInterface {

    //代理类执行的方法
    void doSomething1();
    void doSomething2();
    
    //需要被代理类执行的方法
    void proxyMethod();
    
}
 

package Proxy.StaticProxy;


/**
 * 代理类
 * @author DMW
 * @2019年1月17日
 */
public class Proxy  implements ProxyInterface{

    private ProxyInterface proxyed;
    
    public Proxy(ProxyInterface proxyed) {
        super();
        this.proxyed = proxyed;
    }

    @Override
    public void doSomething1() {
        System.out.println("代理人做的doSomething1");
    }

    @Override
    public void doSomething2() {
        System.out.println("代理人做的doSomething2");
    }

    @Override
    public void proxyMethod() {
        proxyed.proxyMethod();
    }

}
 

==================================JDK动态代理===================================

package Proxy.JDKDynamicProxy;

import java.lang.reflect.Proxy;

/**
 * 利用JDK动态代理-(只可对接口进行代理)
 * @author DMW
 * @2019年1月17日
 */
public class Main {

    /**
     * 相对于静态代理,处理类不需要实现代理接口,也就不用实现接口,
     * 而且被代理的类不是写死的,可以在运行时根据不同的类进行动态的代理。
     */
    
    /**
     * 需要 
     * 
     * java.lang.reflect.Proxy ,代理类
     * java.lang.reflect.InvocationHandler,代理执行接口
     * 
     * Proxy 反射生成代理类,执行代理方法
     * InvocationHandler 实现其invoke方法,通过此方法执行代理方法,可在此方法内进行额外操作等
     */
    
    public static void main(String[] args) {
        //被代理类
        ProxyInterface beProxy= new BeProxyed();
        //代理处理类
        ProxyHandlar handlar =new ProxyHandlar(beProxy);
        //通过jdk 
        ProxyInterface proxy=(ProxyInterface)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{ProxyInterface.class}, handlar);
        proxy.proxyMethod();
    }
}


 

package Proxy.JDKDynamicProxy;

/**
 * 被代理的类
 */
public class BeProxyed implements ProxyInterface{

    @Override
    public void proxyMethod() {
        System.out.println("我是被代理类,proxyMethod是我应该做的");
    }

}
 

package Proxy.JDKDynamicProxy;

/**
 * 代理接口
 * @author DMW
 * @2019年1月17日
 */
public interface ProxyInterface {

    //需要被代理类执行的方法
    void proxyMethod();
    
}
 

package Proxy.JDKDynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 代理处理类
 * @author DMW
 * @2019年1月17日
 */
public class ProxyHandlar implements InvocationHandler{
    
    //被代理的类
    private ProxyInterface proxyInterface;
    
    public ProxyHandlar(ProxyInterface proxyInterface) {
        super();
        this.proxyInterface = proxyInterface;
    }

    /**
     * 核心的方法
     * 
     * proxy  代理类
     * method 代理方法
     * args 代理方法参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("我可以做别的了");
        //执行被代理的方法
        method.invoke(proxyInterface, args);
        System.out.println("我已经收尾了");
        
        return null;
    }

}
 

======================================CGLB动态代理========================

package Proxy.CGLBDynamicProxy;

import net.sf.cglib.proxy.Enhancer;

public class Main {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(BeProxyed.class);
        enhancer.setCallback(new Proxy());
        
        BeProxyed proxy=(BeProxyed)enhancer.create();
        proxy.proxyMethod();
    }
}
 

package Proxy.CGLBDynamicProxy;

/**
 * 被代理的类
 */
public class BeProxyed {
    public void proxyMethod() {
        System.out.println("我是被代理类,proxyMethod是我应该做的");
    }
}
 

package Proxy.CGLBDynamicProxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Proxy implements MethodInterceptor{
    
    /**核心方法
     * sub 代理对象
     * methodProxy 代理方法
     * objects 方法参数
     * method 被代理方法
     */
    @Override
    public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("我开始做别的事了");
        //代理执行方法
        methodProxy.invoke(sub, objects);
        System.out.println("我完事了");
        return null;
    }

}
 

猜你喜欢

转载自blog.csdn.net/D_MingWang/article/details/86535518
今日推荐