设计模式-动态代理模式

目录

 什么是代理模式?

  为什么要用代理模式?

   有哪几种代理模式?

动态代理(jdk自带):

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



 什么是代理模式?

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


  为什么要用代理模式?

        中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,
而代理类对象可以在客户类和委托对象之间起到中介的作用,其 特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:
        代理类除了是客户类和委托类的中介之外,我们还可以通过给代理 类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。


   有哪几种代理模式?

            我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:
 静态代理:
       静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
 动态代理:
       动态代理是在程序运行时通过反射机制动态创建的。
  动态代理分为:
         基于接口的动态代理(jdk自带)
        基于子类的动态代理(第三方)

动态代理(jdk自带):

        代码示例:

//接口类
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):

        代码示例:

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();
    }
}

运行结果:

静态代理(代码示例):

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

//接口
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();
    }
}

运行结果:

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值