资讯专栏INFORMATION COLUMN

漫谈代理模式

neuSnail / 3021人阅读

摘要:而在模式中角色与角色的接口是相同的透明性。而在模式中与增加新功能相比它更注重通过设置代理人的方式来减轻本人的工作负担

本文首发于泊浮目的专栏:https://segmentfault.com/blog...
前言

代理模式是在编程中非常常见的设计模式.笔者在面试的过程中也经常会问到相关的问题,但是很多同学答的并不尽人意.在这篇文章中,笔者想和大家聊聊代理模式的应用及一些实践.

What

先来一张图

我们可以很明显的看到,代理和客户端发生了耦合,而目标端则与客户端解耦.

Why

上文提到了一点,松耦合.而在任何设计模式中,他们的目的都在以下范围内:

减少代码冗余度,提高代码复用性

松耦合

这里提到了代码的复用性,也可以多嘴一句,代理模式可以帮助我们实现The Open Closed Principle.

在这里,我们可以举一个例子.Target可能是一位不错的程序员,client是一家公司.在整个招聘流程中,如果Proxy是猎头,有些猎头则可能会想办法帮程序员提高身价.而如果Proxy是Hr,则可能会来杀杀价.而程序员走的流程可能一直是一样的:

电面

到面

签合同

我们可以把不同的行为(讨价还价的特殊技巧)写在不同的Proxy里(HrProxy or 猎头Proxy),而我们的程序员只要专心走流程就行了.

How

以Java中最常用的框架——Spring为例.Spring最主要提供了2个功能:

IOC(Inversion of Control)

AOP(Aspect Oriented Programming)

而我们知道,Spring的AOP本质上是通过代理模式来做的.接下来我们来详细聊聊Spring提供的4种类型的AOP支持:

基于代理的经典Spring AOP;

纯POJO切面;

@AspectJ注解驱动的切面;

注入式AspectJ切面(适用于Spring各版本)。

前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。

而SpringAOP支持两种模式的动态代理,JDK Proxy和cglib.当Spring发现目标被代理类实现就接口时,则用JDK Proxy来实现.

JDK Proxy不完全通过反射来做,也有ASM进行字节码操作的.本质是通过接口约定来做的

cglib完全通过ASM字节码来做.本质通过继承的方式实现

代码大概长这样:

//spring aop 生成的代理
public class SpringAopTargetProxy extends Target{
    public void  operate(){
            //spring aop method1...
            super.operate();
           //spring aop method2...
    }
}

而AspectJ是通过编译时编织来做的,即在编译时插代码进去.所以可以认为它基于静态代理来做AOP.

基于以上,我们也可以推导出SpringAOP对于finalorstatic方法是无效的.

callexecution有什么区别呢?

call就是在调用这个方法的地方插入代码

execution就是在调用这个方法的前面插入代码

代理模式的变化形式

之前,我们根据代理生成的时机来区分了静态代理和动态代理.而根据使用方式,常见则有两类:

Virtual Proxy:只有当真正需要实例时,它才生成和初始化实例

Remote Proxy:远程代理可以让我们不必关心RealSubject角色是否在网络上,而是像调本地方法一样调用它的方法.Java的RMI(Remote Method Invocation)就相当于远程代理.

类似的设计模式 Adapter

Adapter模式适配了两种具有不同接口(API)的对象,以使它们可以一同工作。而在Proxy模式中, Proxy角色与RealSubject角色的接口(API )是相同的(透明性)。

Decorator

Decorator模式与Proxy模式在实现上很相似(比如API的一致性),不过它们的使用目的不同——Decorator模式的目的在于增加新的功能。而在Proxy模式中,与增加新功能相比,它更注重通过设置代理人的方式来减轻本人的工作负担.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74343.html

相关文章

  • 漫谈Web缓存

    摘要:了解前端缓存是打造高性能网站的必要知识。这个表示,你的请求发送到后端,后端判断并认为资源可以继续使用,直接使用本地缓存。尽可能的设置久缓存时间,通过码来管理版本。参考链接浅谈缓存权威指南上配置缓存首发地址 背景说明 缓存一直是前端性能优化中,浓墨重彩的一笔。了解前端缓存是打造高性能网站的必要知识。 之前,对于缓存的认知一直停留在看《HTTP权威指南》和一些相关帖子的深度,过了一段时...

    davidac 评论0 收藏0
  • 漫谈Web缓存

    摘要:了解前端缓存是打造高性能网站的必要知识。这个表示,你的请求发送到后端,后端判断并认为资源可以继续使用,直接使用本地缓存。尽可能的设置久缓存时间,通过码来管理版本。参考链接浅谈缓存权威指南上配置缓存首发地址 背景说明 缓存一直是前端性能优化中,浓墨重彩的一笔。了解前端缓存是打造高性能网站的必要知识。 之前,对于缓存的认知一直停留在看《HTTP权威指南》和一些相关帖子的深度,过了一段时...

    Carl 评论0 收藏0
  • 漫谈Web缓存

    摘要:了解前端缓存是打造高性能网站的必要知识。这个表示,你的请求发送到后端,后端判断并认为资源可以继续使用,直接使用本地缓存。尽可能的设置久缓存时间,通过码来管理版本。参考链接浅谈缓存权威指南上配置缓存首发地址 背景说明 缓存一直是前端性能优化中,浓墨重彩的一笔。了解前端缓存是打造高性能网站的必要知识。 之前,对于缓存的认知一直停留在看《HTTP权威指南》和一些相关帖子的深度,过了一段时...

    shuibo 评论0 收藏0
  • 如何应对服务器压力?服务器横向扩展(加机器)策略漫谈

    摘要:均衡负载多台服务器执行程序,将大量请求分摊给多台服务器无论如何,一台服务器的进程是有限的,我们不可能无限制的把一台服务器的加到个,把内存加到,则是不可能的。 在生产环境中,一个网站或服务端应用出现响应迟缓的时候,就应该考虑是否由于用户量太多,导致服务器难以处理的情况,并应该考虑花钱来解决这个问题。当然,这里首先会想到廉价的解决方式,比如通过调整服务器配置,优化代码性能等,但这些方式技术...

    he_xd 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<