设计模式 - 代理模式 和 装饰模式 有什么区别?
总结
1.装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。
2.换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
3.我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
所以考虑这两种设计模式的时候,要分清楚你自己的开发者角色:
- 如果是别人A已经给你一个类,你需要做好增强给第三方C使用增强的类,且C不可以直接使用未增强的类对象,那么你这个开发者应该使用代理模式,把你可以获得的类对象封装到自己的代理类;
- 如果你希望把何时增强功能的这个决策权交给C,即C既可以使用增强的类对象,也可以使用不增强的对象,决定权在于C,那么这个时候你应该使用装饰器模式。
代理模式 代码
//代理模式 public class Proxy implements Subject{ private Subject subject; public Proxy(){ //关系在编译时确定:把真实对象RealSubject封装在内部,不暴露出去 subject = new RealSubject(); } public void doAction(){ …. subject.doAction(); …. } }
//代理的客户 public class Client{ public static void main(String[] args){ //客户不知道代理委托了另一个对象 Subject subject = new Proxy(); … } }
装饰模式 代码
//装饰器模式 public class Decorator implements Component{ private Component component; //将原始对象作为一个参数传给装饰者的构造器 public Decorator(Component component){ this.component = component } public void operation(){ …. component.operation(); …. } }
//装饰器的客户 public class Client{ public static void main(String[] args){ //客户指定了装饰者需要装饰的是哪一个类 Component component = new Decorator(new ConcreteComponent()); … } }
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-09-20 Java 多线程 - Exchange
2020-09-20 Java 多线程 - Semaphore
2020-09-20 Java 多线程 - CountDownLatch & CyclicBarrier
2020-09-20 Java 多线程 - Fork-Join
2020-09-20 Java 多线程 - LongAdder 与 AtomicLong有什么区别
2020-09-20 Java 多线程 - 原子操作CAS
2020-09-20 Java 多线程 - Lock接口,Condition接口 标准用法