简单纪要:代理模式
代理模式理解:
使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上。
代理模式 :静态代理 显式的指明了代理类和被代理类
1:创建提供代理的服务类接口
//方便真实对象实现 并重写,书写真实访问信息
interface NetWork { public void browse(); }
2:创建被代理类
//被代理类 实现服务接口
class RealServer implements NetWork { @Override public void browse() { System.out.println("真实服务器联网浏览网页"); } }
3:创建代理类
//代理类声明 服务接口类的属性 ,并重写服务接口的方法,添加被代理类实现不了的操作
class ProxyServer implements NetWork { private NetWork work; public ProxyServer(NetWork work) { this.work = work; } public void check() { System.out.println("检查网络连接是否通畅"); }
@Override public void browse() { check(); System.out.println("代理服务器代理真实服务器操作:"); work.browse(); } }
4:测试单元
public static void main(String[] args) { //创建被代理对象 NetWork work = new RealServer(); //实现代理 ProxyServer proxy = new ProxyServer(work); //调用被代理方法 proxy.browse(); }
静态代理的缺点:
①代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。
②同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。
代理模式 :动态代理 动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。
1:创建提供代理的服务类接口
//方便真实对象实现 并重写,书写真实访问信息
interface NetWork { public void browse(); }
2:创建被代理类
//被代理类 实现服务接口 class RealServer implements NetWork { @Override public void browse() { System.out.println("真实服务器联网浏览网页"); } }
3:创建代理类
class DynamicProxyHandler implements InvocationHandler { private Object object; public DynamicProxyHandler(final Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理浏览网页准备"); Object result = method.invoke(object, args); System.out.println("代理浏览网页后"); return result; } }
3:创建测试类
public static void main(String[] args) { NetWork work = new RealServer(); NetWork proxyServer = (NetWork)Proxy.newProxyInstance(NetWork.class.getClassLoader(),new Class[]{NetWork.class},new DynamicProxyHandler(work)); proxyServer.browse(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律