设计模式-动态代理模式

目录

什么是代理模式?

为什么要用代理模式?

有哪几种代理模式?

动态代理(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();
    }
}

运行结果:

相关推荐
七月丶3 小时前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞4 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼4 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟21 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder21 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式