06.java设计模式之代理模式

1.静态代理

接口:

public interface PersonService {
    public void addPerson();
    public void delPerson();
}

  

 

实现类:

public class PersonServiceImpl implements PersonService {
    public void addPerson(){
        System.out.println("addPerson()..........");
    }
    public void delPerson(){
        System.out.println("delPerson()..........");
    }
}

  

静态代理类:

public class StaticProxy implements PersonService{

    private PersonService personService;

    public StaticProxy(PersonService personService) {
        this.personService = personService;
    }

    @Override
    public void addPerson() {
        System.out.println("执行方法前");
        personService.addPerson();
        System.out.println("执行方法后");
    }

    @Override
    public void delPerson() {
        System.out.println("执行方法前");
        personService.delPerson();
        System.out.println("执行方法后");
    }

    public static void main(String[] args) {
        StaticProxy staticProxy = new StaticProxy(new PersonServiceImpl());
        staticProxy.addPerson();
        System.out.println("=============");
        staticProxy.delPerson();
    }
}

  

 

2.jdk动态代理 只可以代理接口

接口:

public interface PersonService {
    public void addPerson();
    public void delPerson();
}
实现类:
public class PersonServiceImpl implements PersonService {
    public void addPerson(){
        System.out.println("addPerson()..........");
    }
    public void delPerson(){
        System.out.println("delPerson()..........");
    }
}

 代理类:

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

public class JdkProxy<T> implements InvocationHandler {
    //代理对象
    private T target;

    public JdkProxy(T target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("1111");
        Object invoke = method.invoke(target, args);//执行代理对象的方法
        System.out.println("22222");
        return invoke;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    public static void main(String[] args) {
        PersonService personService = new PersonServiceImpl();
        JdkProxy proxy = new JdkProxy(personService);
        PersonService proxyInstance = (PersonService) proxy.getProxyInstance();
        proxyInstance.addPerson();
    }
}

  

3.Cglib动态代理:导入包:cglib-full-2.0.2.jar   可以代理接口和类

 接口

public interface PersonService {
    public void addPerson();
    public void delPerson();
}

  

实现类:

public class PersonServiceImpl implements PersonService {
    public void addPerson(){
        System.out.println("addPerson()..........");
    }
    public void delPerson(){
        System.out.println("delPerson()..........");
    }
}

  

代理类:

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

import java.lang.reflect.Method;

public class CglibProxy<T> implements MethodInterceptor {
    private T target;

    public CglibProxy(T target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("执行方法前");
        Object invoke = method.invoke(target, args);
        System.out.println("执行方法后");
        return invoke;
    }

    public Object getInstance(){
        Enhancer enhancer  = new Enhancer();
        enhancer.setInterfaces(target.getClass().getInterfaces());
        enhancer.setClassLoader(target.getClass().getClassLoader());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public static void main(String[] args) {
        PersonService personService = new PersonServiceImpl();
        CglibProxy proxy = new CglibProxy(personService);
        PersonService proxyInstance = (PersonService) proxy.getInstance();
        proxyInstance.addPerson();
        System.out.println("=================");
        proxyInstance.delPerson();
    }
}

  

posted on 2018-06-12 16:45  开心就好呀·  阅读(78)  评论(0编辑  收藏  举报

导航