设计模式之代理模式(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
作者
Glo6f
发布于
2022年02月13日
许可协议