设计模式-动态代理模式

目录

什么是代理模式?

为什么要用代理模式?

有哪几种代理模式?

动态代理(jdk自带):

动态代理(第三方库-cglib):


什么是代理模式?

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

通俗的来讲代理模式就是我们生活中常见的中介。

举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。

为什么要用代理模式?

中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,

而代理类对象可以在客户类和委托对象之间起到中介的作用,其 特征是代理类和委托类实现相同的接口。
开闭原则, 增加功能:

代理类除了是客户类和委托类的中介之外,我们还可以通过给代理 类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。

有哪几种代理模式?

我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:
静态代理:

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

动态代理:

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

动态代理分为:

基于接口的动态代理(jdk自带)

基于子类的动态代理(第三方)

动态代理(jdk自带):

代码示例:

java 复制代码
//接口类
public interface ISinger {
    public void singer();

    public int dance(int n);
}


//实现类
public class Xiaomei implements ISinger{
    @Override
    public void singer() {
        System.out.println("=====唱一首狼的诱惑=====");
    }

    @Override
    public int dance(int n) {
        System.out.println("=====跳一个昆卡=====");
        return 0;
    }
}


//静态代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test01 {
    public static void main(String[] args) {
        ISinger singer=new Xiaomei();
        //jdk动态代理(类加载器,动态字节数组,处理代理实例方法调用)
        ISinger Jingjiren=(ISinger) Proxy.newProxyInstance(singer.getClass().getClassLoader(), singer.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("做个自我介绍");
                Object obj=method.invoke(singer,args);

                return obj;
            }
        });
        Jingjiren.singer();
        Jingjiren.dance(6);
    }
}

运行结果:

动态代理(第三方库-cglib):

代码示例:

java 复制代码
public interface ISinger {
    public void singer();

}



public class ZhouJieLun implements ISinger{
    @Override
    public void singer() {
        System.out.println("----一首反方向的钟送给大家----");
    }
}



import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;

public class Test02 {
    public static void main(String[] args) {
        ISinger singer=new ZhouJieLun();
        //第三方库的动态代理
        ISinger Jingjiren=(ISinger) Enhancer.create(singer.getClass(), singer.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("-------自我介绍-------");
                Object obj=method.invoke(singer,objects);
                return obj;
            }
        });
        Jingjiren.singer();
    }
}

运行结果:

静态代理(代码示例):

java 复制代码
//当西门庆想找潘金莲,但是他不能直接找,那么需要找个中间代理,
当西门庆调中间代理时便调到了潘金莲

//接口
public interface IWomen {
    public void makeEyeWithMan();
}


public class PanjinglianImpl implements IWomen{

    @Override
    public void makeEyeWithMan() {
        System.out.println("回眸一笑,抛个媚眼~");
    }
}



public class WangPoImpl implements IWomen{
    //被代理对象
    IWomen woman;
    public WangPoImpl(IWomen woman) {
        this.woman = woman;
    }

    @Override
    public void makeEyeWithMan() {
        System.out.println("镇一壶酒,搞搞气氛~");
        woman.makeEyeWithMan();
    }
}




public class XiMenQing {
    public static void main(String[] args) {
        //创建被代理对象
        PanjinglianImpl panjinglian=new PanjinglianImpl();
        //创建代理
        WangPoImpl wangPo=new WangPoImpl(panjinglian);
        wangPo.makeEyeWithMan();
    }
}

运行结果:

相关推荐
一条闲鱼_mytube18 小时前
智能体设计模式(三)多智能体协作-记忆管理-学习与适应
人工智能·学习·设计模式
小屁猪qAq1 天前
设计模式总纲
开发语言·c++·设计模式
小简GoGo1 天前
前端常用设计模式快速入门
javascript·设计模式
会员果汁1 天前
17.设计模式-单例模式(Singleton)
单例模式·设计模式
派大鑫wink1 天前
【Day37】MVC 设计模式:原理与手动实现简易 MVC 框架
java·设计模式·mvc
会员果汁1 天前
18.设计模式-桥接模式
设计模式·桥接模式
老蒋每日coding1 天前
AI Agent 设计模式系列(九)——学习和适应模式
人工智能·学习·设计模式
da_vinci_x2 天前
武器设计实战:一把大剑裂变 5 种属性?Structure Ref 的“换肤”魔法
游戏·3d·设计模式·ai作画·aigc·设计师·游戏美术
刀法孜然2 天前
23种设计模式 3 行为型模式 之3.7 command 命令模式
设计模式·命令模式
一条闲鱼_mytube2 天前
智能体设计模式(二)反思-工具使用-规划
网络·人工智能·设计模式