Skip to content

Latest commit

 

History

History
140 lines (98 loc) · 2.71 KB

代理模式.md

File metadata and controls

140 lines (98 loc) · 2.71 KB

代理模式

静态代理

  • 静态代理: 代码在编译后不会动态变化. 举个例子: 人找工作 通过一些中介进行帮助

  • person 对象

public class Person {

    public void findWork() {
        System.out.println("找工作");
    }

}
  • 智联作为找对工作的代理
public class ZhiLian {

    private Person p;

    public ZhiLian(Person person) {
        this.p = person;
    }

    public void findWork() {
        // 智联帮你找工作
        System.out.println("智联正在帮你寻找工作");
        this.p.findWork();
        System.out.println("帮你找到工作了");
    }

}
  • 执行方法
public class StaticProxyTest {

    public static void main(String[] args) {
        Person p = new Person();
        ZhiLian zhiLian = new ZhiLian(p);
        zhiLian.findWork();
    }

}
  • 执行结果
智联正在帮你寻找工作
找工作
帮你找到工作了

动态代理

  • 基于 JDK 进行实现
public interface ZhiYuan {

    /**
     * 找工作
     */
    void findWork();

}

public class PersonJdk implements ZhiYuan {

    @Override
    public void findWork() {
        System.out.println("找工作");
    }
    
}
  • 找工作的代理对象
public class ZhiLianJdk {

    /**
     * 被代理对象的临时保存结点
     */
    private ZhiYuan target;

    public Object getInstance(ZhiYuan personJdk) {
        this.target = personJdk;
        Class clazz;

        clazz = personJdk.getClass();

        // 重构一个新的对象
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        System.out.println("jdk 代理的智联");

                        Object invoke = method.invoke(target, args);
                        System.out.println("工作找到了");
                        return invoke;
                    }
                });

    }
}
  • 测试方法
public class JdkProxyTest {

    public static void main(String[] args) throws Exception {
        PersonJdk pjd = new PersonJdk();
        Object obj = new ZhiLianJdk().getInstance(pjd);
        // 注意 JDK 代理实现的是接口 并不是实现了接口的类 (PersonJdk)
        ZhiYuan p = (ZhiYuan) obj;
        p.findWork();
    }
}

区别

由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。