Java中的代理模式(个人学习笔记)

什么是代理

  • 代理是一种设计模式,提供了对目标对象另外的访问方式。(用户不需要直接访问目标对象,只需要接触代理对象就能实现访问)

什么是代理

代理的好处

  1. 目标对象可以被间接访问
  2. 可以在目标对象实现的基础上实现额外的功能(除了目标对象提供的方法外,代理可以额外提供一些实用的方法),即扩展目标对象的功能
  3. 不会轻易修改原有代码,如果需要修改需求,可以通过代理去扩展

实现代理的方式

代理

  • 静态代理只能完成对固定类的代理,动态代理的底层通过反射实现,可以完成任意类的代理(静态代理也可以通过接口继承实现)
  • 实现JDK动态代理主要依赖接口实现
  • 需要第三方jar包支撑来实现的功能,一般通过继承来实现

代理实现

代码示例

静态代理(通过接口实现)

//在实现接口的时候,目标类和代理类都必须实现目标接口的方法。从某种意义上,代理类就可以实现目标类的方法,代理类同时可以扩展自己的方法
	
//定义一个接口类,让代理类和目标类都去实现它
public interface ByShop {
    void clothes(String size);
}
    
//定义目标类,这里即买衣服的工厂
public class Factory implements ByShop {
    @Override
    public void clothes(String size) {
    System.out.println("已经为您制作了" + size + "大小尺寸的衣服!");
    }
}
    
//定义代理类,这里是代购
public class Proxy implements ByShop {
    //在代理类中放一个目标对象,目的是实现统一标准
    public Factory factory;
    //这里的代理类只能实现Factory类的代理,因此是静态代理
    public Proxy(Factory factory) {
        this.factory = factory;
    }
    @Override
    public void clothes(String size) {
        frontService();
        factory.clothes(size);
        endService();
    }
    //额外功能
    
    //售前服务
    public void frontService() {
        System.out.println("根据您的需求进行产品研发!");
    }
    //售后服务
    public void endService() {
        System.out.println("产品已交付您,后续有问题随时联系!");
    }
}
    
public class User {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Proxy proxy = new Proxy(factory);
        proxy.clothes("xxl");
    }
}

动态代理(接口实现)

public class Company implements InvocationHandler {
    
    //目标对象
    private Object factory;
    
    public Object getFactory() {
        return factory;
    }
    
    public void setFactory(Object factory) {
        this.factory = factory;
    }

    //通过反射拿到目标对象方法,让代理对象进行调用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object obj = method.invoke(factory, args); //反射
        return obj;
    }

    //售前服务

    //售后服务

    //获取代购员
    public Object getProxyInstance() { //这个方法内部会调用上面的invoke(Object proxy, Method method, Object[] args)方法
        //newProxyInstance()方法可以创建一个代理对象实例,包含三个参数,第一个为类加载器,第二个接口,第三个为代理类
        return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
    }
}
    
public class User {
    //目标对象
    ClothesFactory clothesFactory = new ClothesFactory();
    ShootsFactory shootsFactory = new ShootsFactory();
    //代购公司
    Company company = new Company();
    company.setFactory(clothesFactory); //为代购公司设置目标对象,实现代购衣服的功能
    ByClothes good1 = (ByClothes)company.getProxyInstance(); //得到一个代购衣服的代购员
    good1.clothes("xxl"); //代购衣服
}
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值