代理模式 - 静态代理 VS 装饰者模式

Java开发中,代理模式应用广泛,比如 AOP 的实现原理、日志框架、全局性异常处理、事务处理等。本文先分析一下静态代理与装饰者模式的区别

区别:

对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。他们之间的边界确实比较模糊,两者都是对类的方法进行扩展,具体区别如下:

  1. 装饰器模式强调的是增强自身,在被装饰之后你能够在被增强的类上使用增强后的功能。增强后你还是你,只不过能力更强了而已;代理模式强调要让别人帮你去做一些本身与你业务没有太多关系的职责(记录日志、设置缓存)。代理模式是为了实现对象的控制,因为被代理的对象往往难以直接获得或者是其内部不想暴露出来。
  2. 装饰模式是以对客户端透明的方式扩展对象的功能,是继承方案的一个替代方案;代理模式则是给一个对象提供一个代理对象,并由代理对象来控制对原有对象的引用;
  3. 装饰模式是为装饰的对象增强功能;而代理模式对代理的对象施加控制,但不对对象本身的功能进行增强;

UML类图

代理模式:
请添加图片描述
装饰者模式:
请添加图片描述

从 UML 类图和实现代码上看,代理模式与装饰器模式几乎一模一样。代理模式的 Subject 对应装饰器模式的 Component,代理模式的 RealSubject 对应装饰器模式的 Concrete Component,代理模式的 Proxy 对应装饰器模式的 Decorator。

确实,从实现代码的角度看,代理模式的确与装饰器模式是一样的(其实装饰器模式就是代理模式的一个特殊应用),但是这两种设计模式所面向的功能扩展面是不一样的。

装饰器模式强调自身功能的扩展。Decorator 所做的就是增强 Concrete Component 的功能(也有可能减弱功能),主体对象为 Concrete Component,着重类功能的变化。

代理模式强调对代理过程的控制。Proxy 完全掌握对 RealSubject 的访问控制,因此,Proxy 可以决定对 RealSubject 进行功能扩展、功能缩减甚至功能散失(不调用 RealSubject 方法),主体对象为 Proxy。

设计模式就是为了提升代码的可扩展性,灵活应用即可,没有必要生搬硬套,非要分出个所以然来。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态代理装饰者模式和动态代理都是面向对象编程中的常见设计模式,它们都是用于实现对象间的协作和交互。下面举例说明它们的区别: 1. 静态代理 静态代理是指在编译时就已经确定了代理类和被代理类的关系,代理类在程序运行之前就已经存在。代理类和被代理类都要实现同一个接口或者继承同一个父类,代理类中持有被代理类的实例,通过调用被代理类的方法来实现对被代理类的调用。静态代理的优点是可以在代理类中添加额外的功能,而代理类和被代理类之间的关系在编译时就已经确定,比较稳定。 举例:比如在一个电商网站上,用户下单后需要支付,可以使用静态代理模式,将支付功能封装到一个代理类中,代理类中可以添加一些额外的功能,比如记录日志、发送短信等。 2. 装饰者模式 装饰者模式是指在不改变原有对象的基础上,通过对其进行包装(装饰),来扩展其功能。装饰者模式中有一个抽象组件和多个具体组件,抽象组件定义了被装饰对象的接口,具体组件是被装饰的对象。装饰者可以动态地添加、删除或替换被装饰对象的行为。 举例:比如在一个咖啡店中,原本只有一杯普通的咖啡,但是顾客可以根据自己的喜好选择添加奶油、糖、巧克力等,这些都是装饰者,可以动态地添加、删除或替换。 3. 动态代理 动态代理是指在程序运行时动态地生成代理类,不需要在编译时确定代理类和被代理类的关系,代理类在程序运行时才生成。动态代理需要借助Java的反射机制实现,通过代理类的invoke()方法来调用被代理类的方法。动态代理的优点是可以在运行时动态地生成代理类,比较灵活。 举例:比如在一个WEB应用中,需要根据用户的请求动态地生成不同的代理类,来处理不同的请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值