代理模式(静态代理动态代理)代码实战(详细)

Posted 栗子~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式(静态代理动态代理)代码实战(详细)相关的知识,希望对你有一定的参考价值。

文章目录

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


代理模式(静态代理、动态代理)代码实战(详细)

这里举个例子:
有一个公司想要招聘一个职位,公司大领导不会主动去找求职者吧,他应该让他下级员工,这里就以部门领导来代表下级员工,而求职者不可能直接到达部门领导,他们首先得经历一遍hr筛选后才能到达部门领导这里。

下面是代理方式的流程图:


其中真正被代理的对象为部门领导。

01 静态代理模式

代码实现:

interface Person
    //安排工作
    void applyJob();

class Boss implements Person
    @Override
    public void applyJob() 
        System.out.println("部门领导面试通过后帮忙安排工作,推荐给公司大领导");
    


//代理类
class Hr implements Person
    //组合的方式引用代理对象Boss(遵循组合/聚合复用原则)
    private Boss boss;
    public Hr(Boss boss)
        this.boss = boss;
    
    @Override
    public void applyJob() 
        //这里写具体的业务逻辑
        System.out.println("hr 检查应聘者是否符合工作要求,推荐给部门领导");
        boss.applyJob();
    

测试:

/**
* @description: TODO 静态代理
* @author 杨镇宇
* @date 2022/3/2 15:52
* @version 1.0
*/
public class ProxyTest 
    public static void main(String[] args) 
        Boss boss = new Boss();
        Hr hr = new Hr(boss);
        hr.applyJob();
    

效果:


02 动态代理模式

什么意思呢,大概的意思这个代理类(HR)不仅仅服务于这个部门领导,还服务于其他部门领导。


代码实现(给予JDK做动态代理):

/**
* @description: TODO 动态代理
* @author 杨镇宇
* @date 2022/3/2 16:27
* @version 1.0
*/


public class DyProxy 


    interface Person
        void applyJob();
    
    
    static class Boss implements Person 
        @Override
        public void applyJob() 
            System.out.println("部门领导面试通过后帮忙安排工作,推荐给公司大领导");
        
    
    //代理类
    static class Hr implements InvocationHandler 
        private Object target;
        public Hr(Object target)
            this.target = target;
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
            //这里写具体的业务逻辑
            System.out.println("hr 检查应聘者是否符合工作要求,推荐给部门领导");
            //通过反射来实现
            Object o = method.invoke(target,args);
            return o;
        
    

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException 
        Boss boss = new Boss();
        Class <?> proxyclazz = Proxy.getProxyClass(Person.class.getClassLoader(),Person.class);
        Constructor<?> constructor = proxyclazz.getConstructor(InvocationHandler.class);
        Person person = (Person)constructor.newInstance(new Hr(boss));
        person.applyJob();
    

效果:


03 静态代理和动态代理的区别

静态代理:代码层面,编辑器;
动态代理:运行时做代理(jdk,cglib);

以上是关于代理模式(静态代理动态代理)代码实战(详细)的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式-代理模式之动态代理(附源代码分析)

代理模式(Proxy)

代理模式(动态)

java动态代理实现与原理详细分析

java动态代理实现与原理详细分析

代理模式(静态代理jdk动态代理CGLib动态代理)