JAVA中的代理:代理的作用+静态代理的实现+动态代理的实现
- 一、代理的作用
- 二、静态代理实现方式
- 2.1 实现原理
- 2.2 示例
- 三、动态代理
一、代理的作用
代理是一种设计模式
主要目的:提供了对目标对象另外的访问方式
代理的好处:
- 目标对象可以间接访问
- 代理的主要作用就是增强了目标对象,可以在目标对象实现的基础上增强额外的功能,即扩展目标对象的功能
- 不要随意修改原有代码,如果需要修改,可以通过代理去扩展
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");
}
}