代理模式-积木模式
代理模式-积木模式
代理模式在实际开发中的确非常常见和常用,表面上代理模式是产生出一个代理类,作为访问实际实现类的代理,控制了外界对实际代理类的访问,在此基础上增加一些增强性的功能。实际上,还将实际实现作为一个粒度,将增强的部分功能分离解耦。
这里记录一下实现的一些代码:
静态代理:
public interface Subject { void toilet(); } public class RealSubject implements Subject{ public void toilet() { System.out.println("toilet"); } } /** * 代理类控制了真实角色的访问权限 * 而从代理类自身增强的角度来看,可以说是控制了被代理功能的粒度细分的控制 */ public class SubjectProxy implements Subject{ Subject subject = new RealSubject(); public void toilet() { System.out.println("take my phone"); subject.toilet(); System.out.println("smell bad"); } }
动态代理(java proxy):
public class ProxyHandler implements InvocationHandler { private Object object; public ProxyHandler() { } public ProxyHandler(Object object) { this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("take my phone"); Object result = method.invoke(object,args); System.out.println("smell bad"); return result; } } public class TestProxy { public static void main(String[] args) { Subject subject = new RealSubject(); ProxyHandler proxyHandler = new ProxyHandler(subject); Subject subjectProxy = (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(),proxyHandler); subjectProxy.toilet(); } }
动态代理(cglib):
public class CglibProxyInterceptor implements MethodInterceptor{ public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("take my phone"); Object o1 = methodProxy.invokeSuper(o, args); System.out.println("smell bad"); return o1; } } public class CglibProxyTest { public static void main(String[] args) { CglibProxyInterceptor cglibProxyInterceptor = new CglibProxyInterceptor(); Enhancer enhancer = new Enhancer(); enhancer.setCallback(cglibProxyInterceptor); enhancer.setSuperclass(RealSubject.class); Subject subject = (Subject)enhancer.create(); subject.toilet(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述