简介
- 首先感谢沽泡学院 tom 老师
- 代理模式是一种结构型模式
- 代理模式就是代理对象帮被代理对象处理一些问题, 类似中介, 客户只要结果, 中介怎么搞是他的事儿, 他可能再处理过程中赚外快什么的
- 代理模式的应用: spring中的aop, 日常工作中记录日志, 统计时间,权限控制等
- 这里我们使用一个客户端代理访问google举例, 具体细节可能不合适, 意会、意会、意会...
静态代理
public interface Server {
boolean internetgoogle(Boolean ispass);
boolean internetbaidu(Boolean ispass);
}
public class HKProxyServer implements Server{
private Server client;
public HKProxyServer(Server client) {
this.client = client;
}
@Override
public boolean internetgoogle(Boolean ispass) {
System.out.println("香港代理: ");
return client.internetgoogle(true);
}
@Override
public boolean internetbaidu(Boolean ispass) {
System.out.println("香港代理: ");
return client.internetbaidu(true);
}
}
public class ChinaClient implements Server {
@Override
public boolean internetgoogle(Boolean ispass) {
if(ispass != null && ispass){
System.out.println(" 请求地址: www.google.com 通过");
return true ;
}else{
System.out.println(" 请求地址: www.google.com 拒绝");
return false;
}
}
@Override
public boolean internetbaidu(Boolean ispass) {
System.out.println(" 请求地址: www.baidu.com 通过");
return true;
}
}
public class AccessGoogle {
@Test
public void tryToAccessGoogle(){
Server chinaServer = new ChinaClient();
Assert.assertFalse(chinaServer.internetgoogle(null));
Assert.assertTrue(chinaServer.internetbaidu(null));
System.out.println("--------------------------------------------------通过代理访问--------------------------------------------------");
Server proxyServer = new HKProxyServer(chinaServer);
Assert.assertTrue(proxyServer.internetgoogle(null));
Assert.assertTrue(proxyServer.internetbaidu(null));
}
}
jdk实现动态代理
public class HKProxyServer implements InvocationHandler {
private Server client;
public HKProxyServer(Server client) {
this.client = client;
}
public Object getInstence(){
Class<?> clazz = client.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
args = new Object[]{true};
System.out.println("mylog +++++++++ 动态代理调用方法 " + method.getName());
return method.invoke(this.client, args);
}
}
public class ChinaClient implements Server {
@Override
public boolean internetgoogle(Boolean ispass) {
System.out.println(this);
if(ispass){
System.out.println("请求地址: www.google.com 通过");
return true ;
}else{
System.out.println("请求地址: www.google.com 拒绝");
return false;
}
}
@Override
public boolean internetbaidu(Boolean ispass) {
System.out.println(this);
System.out.println("请求地址: www.baidu.com 通过");
return true;
}
}
public class AccessGoogle {
@Test
public void tryToAccessGoogle(){
Server chinaClient = new ChinaClient();
Server proxyServer = (Server)new HKProxyServer(chinaClient).getInstence();
Assert.assertTrue(proxyServer.internetgoogle(false));
Assert.assertTrue(proxyServer.internetbaidu(true));
Assert.assertFalse(chinaClient.equals(proxyServer));
}
}
cglib实现动态代理
public class HKProxyServer implements MethodInterceptor {
public Object getInstence(Class<?> clazz){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("mylog +++++++++++++++ cglib代理实现: 调用方法" + method.getName());
return methodProxy.invokeSuper(o,objects);
}
}
public class ChinaClient implements Server {
@Override
public boolean internetgoogle(Boolean ispass) {
System.out.println(this);
if(ispass){
System.out.println("请求地址: www.google.com 通过");
return true ;
}else{
System.out.println("请求地址: www.google.com 拒绝");
return false;
}
}
@Override
public boolean internetbaidu(Boolean ispass) {
System.out.println(this);
System.out.println("请求地址: www.baidu.com 通过");
return true;
}
}
public class AccessGoogle {
@Test
public void tryToAccessGoogle(){
Server proxyServer = (Server)new HKProxyServer().getInstence(ChinaClient.class);
Assert.assertTrue(proxyServer.internetgoogle(true));
Assert.assertTrue(proxyServer.internetbaidu(true));
}
}
三种代理方式的分析
- 静态代理: 要做的事情已经是确定的, 只是表面上换了个人去做,代理对象和被代理对象实现同样的接口,实际通过传入对象调用
- jdk动态代理: 与静态代理效果相同, 但是java通过反射实现代理类不用实现与被代理对象同样的接口, 也可以根据传入方法调用被代理对象的方法, 传入对象调用
- cglib动态代理: 只需要传入被代理对象的类名, 内部会实现创建对象到调用的过程,客户端不需要创建具体的对象, 接口调用方法
代码路径
https://github.com/offline7LY/designpattern
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具