JAVA中的代理:代理的作用+静态代理的实现+动态代理的实现

JAVA中的代理:代理的作用+静态代理的实现+动态代理的实现

一、代理的作用

代理是一种设计模式

主要目的:提供了对目标对象另外的访问方式

在这里插入图片描述

代理的好处:

  1. 目标对象可以间接访问
  2. 代理的主要作用就是增强了目标对象,可以在目标对象实现的基础上增强额外的功能,即扩展目标对象的功能
  3. 不要随意修改原有代码,如果需要修改,可以通过代理去扩展

java代理的实现

  • 静态代理
  • 动态代理
    • jdk动态代理(接口)
    • CGLIB(继承)

二、静态代理实现方式

2.1 实现原理

在这里插入图片描述

2.2 示例

最开始我们想购买海外商品时,必须通过代购,因为只有代购知道真买产品在哪里

在这里插入图片描述

//目标接口
public interface ByClothes {
    void clothes(String size);
}
//目标类
public class ClothesFactory implements ByClothes{
    @Override
    public void clothes(String size) {
        System.out.println(size+" 尺寸的衣服制作完毕");
    }
}

代理类也是实现目标接口,但是里面的clothes方法调用的是目标类的方法,在代理类中不止有目标类的方法还有其他的方法

//代理类
public class ClothesProxy implements ByClothes{

    private ClothesFactory clothesFactory;
    //构造方法为clothesFactory赋值
    public ClothesProxy(ClothesFactory clothesFactory) {
        this.clothesFactory = clothesFactory;
    }

    @Override
    public void clothes(String size) {

        frontService();
        //目标对象的方法
        clothesFactory.clothes(size);
        endService();
    }
    //售前服务
    public void frontService(){
       System.out.println("售前服务");
    }
    //售后服务
    public void endService(){
        System.out.println("售后服务");
    }
}

三、动态代理

示例2

成立代购公司,能够代购多种产品,这里需要实现InvocationHandler接口,重写invoke方法,在外部是调用的代理对象的invoke方法,但是在内部已经将其重写为目标对象的方法,并且还有其他的方法,达到增强的效果

public class Company implements InvocationHandler {

    private Object obj;

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        frontService();

        Object obj2 = method.invoke(obj,args);

        endService();
        return obj2;
    }



    //售前服务
    public void frontService(){
        System.out.println("售前服务");
    }
    //售后服务
    public void endService(){
        System.out.println("售后服务");
    }

    //获取代购员
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
    }

}
public class MainTest {
    public static void main(String[] args) {
        //目标对象
        ClothesFactory clothesFactory = new ClothesFactory();

        Company company = new Company();
        //设置目标对象
        company.setObj(clothesFactory);

        //代理对象
        ByClothes good1 = (ByClothes)company.getProxyInstance();

        good1.clothes("xx1");




    }

}

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值