当前位置:首页 > 门店拓客 > 正文内容

面试官 | 说一下什么是代理模式?

wxianyue6小时前门店拓客638
国内最强的AI写作工具,帮你写爆款文案

代理模式_代理模式是什么意思_代理模式和装饰器模式的区别

看了这篇文章,你会对静态代理模式,JDK 动态代理模式和 CGLIB 动态代理模式有个很清晰的认识。

01、简介

什么是代理模式

代理模式也称为委托模式,属于结构型模式之一。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,比如我们生活中的邮局,快递公司,婚介所等等。

代理模式分类

代理模式分为静态代理模式和动态代理模式

静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行之前,代理类.class文件就已经被创建了

动态代理是在程序运行时通过java反射机制动态创建的。

代理模式的目的

代理模式主要有两个目的:一保护目标对象,二增强目标对象。

02、静态代理模式

静态代理模式的话我模拟一个古代结婚的场景。场景是这样的:在古代,某家的公子看上了别家的姑娘,一般都是家里的大人去姑娘的家里提亲代理模式,双方父母同意了,然后就拜堂成婚,后面要宴请亲朋好友。这里这个公子只需要拜堂成婚就行了,至于提亲和宴请亲友都是父母操办的。我们用代码来模拟一下这个场景。

首先我们来建个 接口:

public interface Person {
    /**
     * 人有很对行为,这里我们用到的是结婚
     */
    void marry();
}

然后这家公子要成亲,我们建个 Son 类实现 接口:

public class Son implements Person {
    @Override
    public void marry() {
        System.out.println("我终于结婚了");
    }
}

父亲帮儿子提亲,建个 类:

public class Father {
    private Son son;
    public Father(Son son){
        this.son = son;
    }
    public void marry(){
        System.out.println("父亲上门提亲");
        this.son.marry();
        System.out.println("父亲宴请亲友");
    }
}

最后是测试代码:

public class Test {
    public static void main(String[] args) {
        Father father = new Father(new Son());
        father.marry();
    }
}

输出:

父亲上门提亲
我终于结婚了
父亲宴请亲友

代码写完了,大家有没有发现静态代理模式的一个缺点。那就是单一代理模式,一个类只能代理一个目标对象。比如上面的场景,父亲只能为自己的儿子提亲,不能为别人家的孩子提亲。

下面我们来看看动态代理是怎么解决这个问题的。

03、动态代理模式

动态代理模式分为 JDK 动态代理和 cglib 动态代理两种。这里先用 JDK 动态代理的方式来模拟一个通过婚介所找朋友的场景。

先将 接口改动下:

public interface Person {
    /**
     * 找朋友
     */
    void findFriend();
}

然后是婚介所 类:

public class JDKMatrimonialAgency implements InvocationHandler {
    //被代理的对象,把引用给保存下来
    private Object target;
    public Object getInstance(Object target) throws Exception{
        this.target = target;
        Class clazz = target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object obj = method.invoke(this.target,args);
        after();
        return obj;
    }
    private void before(){
        System.out.println("这里是婚介所,请提供你的需求");
    }
    private void after(){
        System.out.println("已经找到合适的,尽快安排你相亲");
    }
}

JDK 动态代理主要是实现 接口,并实现 方法

然后创建 类:

public class Customer implements Person {
    @Override
    public void findFriend() {
        System.out.println("我要找一个胸大,腿长又好看的美女");
    }
}

最后测试类:

public class Test {
    public static void main(String[] args) {
        try {
            Person obj = (Person)new JDKMatrimonialAgency().getInstance(new Customer());
            obj.findFriend();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

看下结果:

这里是婚介所,请提供你的需求
我要找一个胸大,腿长又好看的美女
已经找到合适的,尽快安排你相亲

然后我们用 CGLIB 来实现可以帮你写爆款文案的AI系统,如果不是(已经集成了 CGLIB )环境需要先引入 jar 包:


    cglib
    cglib
    3.3.0

然后加一个 cy 类:

public class CglibMatrimonialAgency implements MethodInterceptor {
    public Object getInstance(Class clazz) throws Exception{
        Enhancer enhancer = new Enhancer();
        //要把哪个设置为即将生成的新类的父类
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
        throws Throwable {
        //业务的增强
        before();
        Object obj = methodProxy.invokeSuper(o,objects);
        after();
        return obj;
    }
    private void before(){
        System.out.println("这里是婚介所,请提供你的需求");
    }
    private void after(){
        System.out.println("已经找到合适的,尽快安排你相亲");
    }
}

CGLIB 主要是实现 并实现 方法。

看下结果:

这里是婚介所,请提供你的需求
我要找一个胸大,腿长又好看的美女
已经找到合适的,尽快安排你相亲

04、JDK和CGLIB动态代理对比

JDK 动态代理是实现了被代理对象的接口,CGLib 是继承了被代理对象。

JDK 和 CGLib 都是在运行期生成字节码,JDK 是直接写 Class 字节码,CGLib 使用 ASM框架写 Class 字节码,Cglib 代理实现更复杂,生成代理类比 JDK 效率低。

JDK 调用代理方法,是通过反射机制调用,CGLib 是通过 机制直接调用方法,CGLib 执行效率更高。

05、代理模式的优缺点

优点:

降低耦合度,扩展性好

代理对象将代理对象和目标对象分离,起到保护目标对象的作用

可以对目标对象的功能增强

缺点:

增加类的数量

因为会调用增强方法,所以会造成处理速度慢

增加了系统的复杂度(这是好的架构都会有的缺点,比如)

近期热文

【END】

手机浏览,点击图片保存二维码到相册,然后打开微信扫一扫选择本二维码图片就可以进入,电脑端微信“扫一扫”二维码,进入找聊天搭子平台,里面有找饭搭子、找对象、找陪伴服务等等

扫描二维码推送至手机访问。

版权声明:本文由小猪信息平台发布,如需转载请注明出处。

本文链接:https://pplcom.com/post/59131.html

分享给朋友:

相关文章

小程序1.0-2.0,微信小程序生态的现在式和将来时

小程序1.0-2.0,微信小程序生态的现在式和将来时

从跳一跳、小打卡到海盗来了、享物说…仅出现16个月的小程序生态里,诞生了一个又一个“现象级”应用。小程序无需下载安装,相比App有着流量红利,逐步开放的新功能,给零售电商,内容付费等的行业带来了新的创...

CS门店的引流之痛:面膜之后,还有什么?

CS门店的引流之痛:面膜之后,还有什么?

文|化妆品财经在线CBO张钊 湖南益阳市米兰日化是一家超过25年的化妆品老店,从时间的跨度上来说,算是见证了中国美妆市场的蓬勃发展史。 记者在走访该店时了解到,随着市场不断变化,现如今米兰日化的面膜品...

支付宝商业能力“交卷”:促零售商降本增收各60%,延伸线上场景引流抗疫

支付宝商业能力“交卷”:促零售商降本增收各60%,延伸线上场景引流抗疫

数字化转型已是大势所趋,不少零售企业开始重点拓展线上渠道、挖掘新的流量来源,希望做到线上线下融合发展。尤其是新型冠状病毒疫情爆发,使得实体店面临到店客流下滑等困局,诸多零售操盘者表示决心加速数字化转型...

华润/万达/沃尔玛等线下零售,如何利用微信裂变给门店引流?

华润/万达/沃尔玛等线下零售,如何利用微信裂变给门店引流?

当线下门店遇上互联网玩法,它们将碰撞出怎样的火花呢?它们造成的传播效果、引流效果又如何呢?本文将告诉我们实现方法与实现效果。 线下的“购物中心”在策划线上传播活动,普遍都会遇到一个问题:很难调动所有...

非常奏效的实体店铺运营谋略,痛苦的你,不妨也可以套用试一下

非常奏效的实体店铺运营谋略,痛苦的你,不妨也可以套用试一下

作者:庞刚言商 / 来源:原创。首发站不管是疫情影响,还是移动互联网电子商务的崛起。近几年来,给大家的感受,实体零售业的生意运营,难度系数越来越大了,而且,对赚钱来讲,越发艰难。 市场经济表现出如此...

惠达卫浴互联网+大促 为消费者带来全新消费体验

惠达卫浴互联网+大促 为消费者带来全新消费体验

双十一全球购物季即将来临,在买买买的同时,特别在购买卫浴产品的时候,总想着能否体验一番?为了你有更好的消费体验,彻底解决消费痛点,中国卫浴领导品牌惠达卫浴,于10月20日至11月11日举行“智惠大不同...