设计模式-动态代理模式

目录

什么是代理模式?

为什么要用代理模式?

有哪几种代理模式?

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

运行结果:

相关推荐
jsonbro2 小时前
手把手带你实现发布订阅模式
前端·vue.js·设计模式
workflower2 小时前
室内外配送机器人-应用路径
人工智能·机器学习·设计模式·矩阵·自动化
ttod_qzstudio9 小时前
【软考设计模式】原型模式:“克隆“对象与深拷贝、浅拷贝精讲
设计模式·原型模式
geovindu9 小时前
java: Builder Pattern
java·开发语言·后端·设计模式·建造者模式·生成器模式
越甲八千9 小时前
代理模式和适配器模式区别
代理模式·适配器模式
researcher-Jiang20 小时前
Design Patterns——Template Method入门到情景实战
python·设计模式·模板方法模式
饼干哥哥1 天前
用Claude Code跑通跨境电商的5大场景,顶10个人的团队
人工智能·设计模式·正则表达式
折哥的程序人生 · 物流技术专研1 天前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
折哥的程序人生 · 物流技术专研1 天前
第3篇:手写一个饮品制作模板(附代码)
java·设计模式·行为型模式·模版方法模式·钩子方法·代码复用·编程实战
ttod_qzstudio1 天前
【软考设计模式】单例模式:唯一实例的管控与线程安全精讲
单例模式·设计模式