设计模式之代理模式(proxy)
代理模式
静态代理
被代理对象每增加方法,代理对象不能感知.不利于扩展
不符合开闭原则
public class Foo {
private Son son;
public Foo(Son son) {
this.son = son;
}
public void proxyJob(){
this.son.job();
}
}
public class Son {
public void job(){
System.out.println("job ... ");
}
}
动态代理
JDK
必须继承接口
接口
public interface Person {
void job();
}
实现类
public class Lily implements Person{
@Override
public void job() {
System.out.println("job ...");
}
}
InvocationHandler
public class ProxyHandler implements InvocationHandler {
private Object person;
public ProxyHandler(Object person) {
this.person = person;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object invoke = method.invoke(person);
System.out.println("after");
return invoke;
}
}
main
public class Main {
public static void main(String[] args) {
Lily lily = new Lily();
Person person = (Person) Proxy.newProxyInstance(Main.class.getClassLoader(), lily.getClass().getInterfaces(), new ProxyHandler(lily));
person.job();
}
}
CGLIB
可以不继承接口,实现原理是通过编辑字节码来实现继承
不能实现final类的代理
设计模式之代理模式(proxy)
https://www.blaaair.com/archives/she-ji-mo-shi-zhi-dai-li-mo-shi-proxy