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();
}
}
浙公网安备 33010602011771号