使用注解可以优化动态代理模式,能够让用户更简单地编写动态代理模式的代码,并且能够自动搜索需要代理的类,只需要在类上配置好注解就能自动生产对象,还能够过滤不需要监听的方法,用户只需要写自己的业务代码即可。
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。
为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
今天我来全面讲解Android开发中最常用的设计模式 - 代理模式中的动态代理模式
在目标对象较多的情况下,若采用静态代理,则会出现 静态代理对象量多、代码量大,从而导致代码复杂的问题
代理模式是23种设计模式之一。设计模式是前人总结的,在软件开发过程遇到常用问题的解决方案,常见的设计模式有单例模式、工厂模式、适配器模式等等。
动态代理能够自动监听代理对象的方法,并且能够自动生成代理类的代码,这样就不需要我们自己去重写代理对象里的方法了,这样解决了代理类代码因业务庞大而庞大的问题,因为动态代理模式会在代码运行时根据代码来在内存中动态生成一个代理类自动重写代理对象的方法,然后这个动态代理类再调用处理类里的代码,处理类再调用到实际方法上去。而且我们可以选择性的监听代理对象的方法,有些不需监听的方法就可以在处理类中过滤掉。所以动态代理的优势就在于可以自动的对代理类的方法进行统一的处理,而不用手动去修改代理类里的每个方法。
所谓代理,就是替别人完成一些事情。在Java开发中,我们也会遇到一些代理类的场景,这些代理类可以帮其他被代理类完成一些它没有或不方便完成的事情,而且还不会改变被代理类原来的功能。这样的场景有很多,如最常见的场景有权限过滤、添加日志、事务处理等。
生活中对代理模式的使用无处不在,例如明星经纪人对明星业务的代理;律师对原告官司的代理;4s店对汽车制造商的销售代理等等。这些使用场景告诉我们代理模式的本质是:
我在上一篇文章收尾部分提到过,设计模式按照功能性分为三类:创建类、结构类、行为类。创建类设计模式应用于创建对象这一步,包含工厂模式、单例模式、建造者模式、原型模式,通过之前的四篇文章已经全部介绍完。
众所周知AOP(Aspect Oriented Programming)是Spring的核心之一,是OOP面向对象编程的延续和补充,是面向切面编程,他的底层实现是代理模式,简单来说,代理模式分为静态代理模式和动态代理模式,而代理模式又分为JDK动态代理和CGLib代理,AOP则是基于动态代理实现,默认是使用JDK动态代理,若没有接口则会使用CGLib代理,前者基于接口,后者基于子类,若兴趣深入了解代理模式的,可参考 Java代理模式 一文,下面简单说下AOP的基本概念.
Proxy-代理模式 代理模式 代理模式: Proxy Pattern. 指为对象提供一种代理,用以控制对这个对象的访问. 是一种结构型模式 代理模式包含三种角色: 抽象角色Subject: 声明真实角色和代理角色共同接口方法.该类可以是接口也可以是抽象类 代理角色ProxySubject: 代理类. 代理对象内部包含对真实对象的引用,同时代理对象提供与真实对象相同的接口,可以代替真实对象. 同时,代理对象可以在执行真实对象操作时,附加其余的操作,相当于对真实对象进行封装 真实角色RealSubj
Proxy是代理人的意思,指的是代替别人进行工作的人。当不一定需要本人亲自去做的工作的时候,就可以寻找代理人去完成。 但在代理模式中,往往是相反的,通常是代理人碰到工作,就交给被代理的对象去完成,代理人只完成一些准备工作或者收尾工作。 如果读者了解过spring框架的话,就会知道aop也就是面向切面编程其实运用的就是动态代理模式,这可以让被代理的对象专注于完成自己的本职工作,而代理对象可以进行工作前的日志记录,时间计算,在工作之后进行日志记录,收尾工作等附加的功能,需要正式做工作的时候就交给被代理去做。就像插了两个刀到这个被代理的对象前后。所以形象的叫做面向切面编程。 关于动态代理模式和静态代理模式,感兴趣的读者可以参考笔者的另一篇博文: Java动态代理与静态代理http://www.jianshu.com/p/b5e340ec9551
由于没有录音记录,这篇面经全凭记忆写的。被问的有很多不会,中间一度四五个问题连着答不上来...有一些已经记不得了,面试官喜欢深挖一个点问到不会为止,太顶了。
我们都知道java中有23种设计模式,今天我们就来聊一聊这23种设计模式中的代理设计模式,首先代理模式其实就是控制对其他对象的访问,在访问其他对象之前我们可以进行一些其他的操作。其实代理一般分为一以下四类:
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
其中Spring的AOP是典型的动态代理模式 下面我们以网络连接中的代理为例说明动态代理,类图如下:
上一篇文章中,我对Spring源码进行了分析讨论,此处不再赘述,有兴趣的同学可以看看向Spring大佬低头——大量源码流出解析,本文是对上一篇文章的一个补充。回到正题,为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志,权限验证,事务等功能时,只能在在每个对象里引用公共行为,这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
为什么会有面向切面编程(AOP)?我们知道 Java 是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志,权限验证,事务等功能时,只能在在每个对象里引用公共行为,这样做不便于维护,而且有大量重复代码,AOP 的出现弥补了 OOP 的这点不足。
23中(Gof)中代理模式中的一种,AOP本身就是基于动态代理实现的,所以掌握了代理模式对AOP的学习很有帮助,所以先讲下代理模式
来 源:http://cnblogs.com/cenyu/p/6289209.html
装饰模式:简单的来说就是动态的给一个对象增加额外的功能,就单纯的新增功能来说会比单一的给一个子类新增功能来的灵活,是跟代理模式中的静态代理模式和动态代理模式十分相近,但是静态代理会使得代码非常臃肿,维护性比较差,但是动态代理使用代理类,让代理类只是存在于内存当中运行,不需要产生具体的java文件,这样的模式会更加的优秀.接下来是本章的装饰模式 【本文使用lombok依赖,如果不想使用的可以直接使用setter方法】 1.统一的接口: public abstract class Compone
1)代理模式 :为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是 :可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2)被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象 3)代理模式有不同的形式,主要有三种静态代理、动态代理(JDK代理、接口代理)和 Cglib代理(可以在内存动态的创建对象,而不需要实现接口,它是属于动态代理的范畴)。 4)代理模式示意图
装饰模式:简单的来说就是动态的给一个对象增加额外的功能,就单纯的新增功能来说会比单一的给一个子类新增功能来的灵活,是跟代理模式中的静态代理模式和动态代理模式十分相近,但是静态代理会使得代码非常臃肿,维护性比较差,但是动态代理使用代理类,让代理类只是存在于内存当中运行,不需要产生具体的java文件,这样的模式会更加的优秀.接下来是本章的装饰模式
对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利。无论你是对的还是错的,都会在这个平台上找到答案。所
AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清楚的同学可以自行去了解。
CDI 托管 bean 实例本质上是一个自动生成类的可序列化代理实例,它扩展了原始支持 bean 类并通过公共方法将所有公共方法进一步委托给实际实例
此处主要讲解常见的是:单例、工厂方法(及 变式:工厂方法模式、抽象工厂模式)、建造者模式。
AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
上图不是我们真正执行代理类的地方,它是通过super关键字通过调用父类的回调类,执行我们自定义配置代理类,进去瞧一波,接着走到下一步
代理的作用就是不改变目标类的情况下,对目标类进行增强。细品后发现和Spring的Aop有些相似,是的,Spring利用了动态代理实现了Aop的强大功能。
常变对象 与不常变对象之间存在依赖关系的前提下,不常变对象 需随 常变对象经常改变逻辑的问题。即解耦 常变对象 与不常变对象之间的依赖关系
代理模式(Proxy Pattern)一个类代表另一个类的功能,通过代理对象访问目标对象,可以在目标对象实现的基础上,增强额外的功能。
最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理,其中 Spring AOP 就是动态代理的典型例子。动态代理又分为接口代理和 cglib (子类代理),结合我的理解写了几个 demo 分享给你们,这是昨晚修仙到 3 点写出来的文章,不点在看,我觉得说不过去了。
Spring 的核心功能是 IOC 容器以及 AOP 面向切面编程,同样也引入很多设计模式,提高代码的扩展性和灵活性。
为了加深理解我们回顾一下静态代理,定义一个规定行为的明星电影接口 IMovieStar :
1) 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2) 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象 3) 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK 代理、接口代理)和 Cglib 代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。 4) 代理模式示意图
ServletContextResource:访问相对于 ServletContext 路径里的资源的实现类.
结构型模式讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象实现新的功能(对象结构型模式)。
代理模式让我评价就是一个笑面虎,结构超简单,实现比较复杂。大家都知道代理模式深入咱们都业务代码中,(就是代理类把接口都实现类引入进来,然后加以封装,再由其他类使用代理类)应用场景太多了,但是大多都是静态代理,如果真都实现一个动态代理我认为还是一个比较都事情,本文对动态代理这块写对也是比较简单,
这种模式有什么应用场景呢?先说下生活中对应的场景,明星接通告一般商家要找明星做活动,是要先找到他的经纪人,然后经纪人去负责一些琐碎的或者运营方面的事情,而明星只需要做具体的活动相关事情就可以了。这里经纪人的作用就是作为了一个代理。
Proxy(代理模式)属于结构型模式,通过访问代理对象代替访问原始对象,以获得一些设计上的便捷。
看Nacos的源代码时,发现其中有对代理模式的运用,而且用得还不错,可以作为一个典型案例来聊聊,方便大家以更真实的案例来体验一下代理模式的运用。如果你对Nacos不了解,也并不影响对本篇文章的阅读和学习。
领取专属 10元无门槛券
手把手带您无忧上云