设计模式-动态代理模式

目录

什么是代理模式?

为什么要用代理模式?

有哪几种代理模式?

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

运行结果:

相关推荐
丶白泽6 小时前
重修设计模式-结构型-组合模式
设计模式·组合模式
yunhuibin7 小时前
ffmpeg面向对象——参数配置秘密探索及其设计模式
学习·设计模式·ffmpeg
_祝你今天愉快8 小时前
技术成神之路:设计模式(十四)享元模式
java·设计模式
蔚一9 小时前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则
丶白泽11 小时前
重修设计模式-概览
java·设计模式
java_heartLake13 小时前
设计模式之建造者模式
java·设计模式·建造者模式
G皮T13 小时前
【设计模式】创建型模式(四):建造者模式
java·设计模式·编程·建造者模式·builder·建造者
战神刘玉栋14 小时前
《程序猿之设计模式实战 · 观察者模式》
python·观察者模式·设计模式
nakyoooooo15 小时前
【设计模式】工厂模式、单例模式、观察者模式、发布订阅模式
观察者模式·单例模式·设计模式
OkeyProxy15 小时前
怎麼在Ubuntu上設置全局代理
ubuntu·代理模式·proxy模式·ip代理·海外ip代理