什么是代理
- 代理是一种设计模式,提供了对目标对象另外的访问方式。(用户不需要直接访问目标对象,只需要接触代理对象就能实现访问)
代理的好处
- 目标对象可以被间接访问
- 可以在目标对象实现的基础上实现额外的功能(除了目标对象提供的方法外,代理可以额外提供一些实用的方法),即扩展目标对象的功能
- 不会轻易修改原有代码,如果需要修改需求,可以通过代理去扩展
实现代理的方式
- 静态代理只能完成对固定类的代理,动态代理的底层通过反射实现,可以完成任意类的代理(静态代理也可以通过接口或继承实现)
- 实现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"); //代购衣服
}
标签:Java,代购,void,Object,factory,笔记,代理,public
From: https://blog.csdn.net/dawn191228/article/details/141127354