AOP即面向切面的编程,装饰器模式,代理模式都能在不修改原有代码的情况下增加新的功能。

    它们三者有什么必须存在的必要性吗?
    image.png

    Aop 我个人觉得应该是动态代理(代理模式) + 责任链模式的产物,仅有动态代理,没有责任链模式是难以完成aop的设计的,或者说aop的功能是不完善的。

    装饰器模式: 装饰器是指对原有对类进行了一次装饰,并且增添了新对功能,实际案例,参考mybatis对缓存设计,在SimpleExector对上一层添加了CacheExector,在CacheExector中对实际操作还是委托给SimpleExector去完成,只是在操作前增加了缓存,这个就是装饰器模式的典型运用。

    代理模式:代理模式也能够做到一层缓存的功能,但是实现的功能可以是一样的,但是实现的过程是不一致的,一个是切切实实的写了一个类,一个是运行期生成的一个类,真要纠结的话,只能说代理模式可以产生装饰器模式的功能,还是已mybatis举例,参考mybatis-spring包下的SqlSessionTemplate,这个类的内部就存在一次动态代理,他的功能就是调用Session的方法,你说我用装饰器模式能不能实现,也能啊,没有那么方便,我要是多装饰器几次,类的关系就乱了。

    综合来说,就是两个或者3个设计模式各有各的使用场景。

    不要固守模式定义,代理模式 装饰器模式本质上都是实现的委托,叫这个名字我觉得是场景定的,体会一下

    装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出函数中大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

    AOP像OOP一样,只是一种编程范式,AOP并没有规定说,实现AOP协议的代码,要用什么方式去实现。