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(); } }