Java学习路线-57:静态代理和动态代理

举报
彭世瑜 发表于 2021/08/13 23:45:58 2021/08/13
【摘要】 静态代理 角色分析 抽象角色 接口或者抽象类真实角色 被代理的角色代理角色 代理真实角色,一般会做一些附属操作客户角色 使用代理角色进行一些操作 AbstractObject - RealObject - Proxy Client 123456 代码实现 package com.pengshiyu.proxy; // 租借接口 public interf...

静态代理

角色分析

  1. 抽象角色 接口或者抽象类
  2. 真实角色 被代理的角色
  3. 代理角色 代理真实角色,一般会做一些附属操作
  4. 客户角色 使用代理角色进行一些操作
AbstractObject - RealObject - Proxy

Client


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

代码实现

package com.pengshiyu.proxy;

// 租借接口
public interface IRent { void rent();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
package com.pengshiyu.proxy;

public class Host implements IRent{ @Override public void rent() { System.out.println("房东租房"); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
package com.pengshiyu.proxy;

// 中介
public class Proxy implements IRent{ private Host host; public Proxy(Host host){ this.host = host; } @Override public void rent() { this.beforeRent(); this.host.rent(); this.afterRent(); } private void beforeRent(){ System.out.println("中介带看房"); } private void afterRent(){ System.out.println("签订合同"); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
package com.pengshiyu.proxy;

// 客户
public class Client { public static void main(String[] args) { Host host = new Host(); Proxy proxy = new Proxy(host); proxy.rent(); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

使用静态代理

好处:

  1. 使得真实角色处理业务更加纯粹,不再关注公共的问题
  2. 公共业务由代理类完成,实现业务的分工
  3. 公共业务发生扩展时变得更加集中和方便

缺点

  1. 类多了,代理类,工作量变大,开发效率降低

动态代理

动态代理和静态代理的角色是一样的

动态代理的代理类是动态生成的

分类:

  1. 基于接口的动态代理 jdk 动态代理
  2. 基于类的动态代理 cglib、javasist

一个动态代理,一般代理某一类业务,可以代理多个类

package com.pengshiyu.proxy;

public interface IVehicle { void run();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
package com.pengshiyu.proxy;


public class Car implements IVehicle { public void run() { System.out.println("Car会跑"); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
package com.pengshiyu.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class VehicleInvocationHandler implements InvocationHandler { private Object target; public VehicleInvocationHandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("---------before-------"); Object result = method.invoke(target, args); System.out.println("---------after-------"); return result; }

}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
package com.pengshiyu.proxy;

import java.lang.reflect.Proxy;

// 客户
public class Client { public static void main(String[] args) { IVehicle car = new Car(); IVehicle carProxy = (IVehicle)Proxy.newProxyInstance( car.getClass().getClassLoader(), car.getClass().getInterfaces(), new VehicleInvocationHandler(car) ); carProxy.run(); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/106889171

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。