今天和大家聊聊AOP:面向切面编程思想。开始聊之前,先和大家一起从编程思想的发展说起。 编程思想的发展历程: 1、POP编程 首先,大家应该都知道,什么是POP编程吧,就是面向过程编程。关于这个编程思想就不做介绍了。 从思维上来讲,面向过程更强调细节,忽视了整体性和边界性。 典型代表是 C/C++的结构体。 POP的不足: 代码重用性低,不易扩展,维护起来难度大,耦合度比较高。
2、OOP编程 面向对象编程,把事物对象化,对象包含属性和方法,万物皆对象。 当规模不大,面向过程编程就可以了 最终实现业务,还是得面向过程,按照过程,把业务串起来。 OOP的形式:一个模块由多个类组成,模块又组成某个服务,多个服务组成一个系统 业务变更,需要修改代码,类肯定要发生改变 但是类应该是固定的,不应该频繁被修改,甚至是不允许修改 从而引出了设计模式,就是为了解决这个问题。 OOP的思想,对象组织,是以继承关系为主线,纵向的,有底到高。 OOP问题: 1)、共性问题,纵向思维,共性越多,接口就越多 2)、扩展问题,需要对现有的对像动态添加某种行为。 因此,由于OOP的问题,从而引出了AOP编程
3、AOP编程 所谓的AOP :面向切面编程,它是可以通过预编译的方式和运行期动态实现,在不修改源代码的情况下,给程序动态统一添加功能的技术。 OOP是关注将需求功能划分为不同的,相对独立的,封装良好的类,并让他们有自已的行为,依靠继顾,多态来定义彼此的关系。 AOP是希望能够将通用功能从不相关的类分离出来,能够使很多类,共享一个行为,这个行为,一旦发生变化,我们只需要修改这个行为就行了,而不需要去修改其他的类。 AOP的切面怎么理解呢? 橫切关注点:比如一个电商系统,处理一个订单,需要进行授权认证,订单处理,日志记录。。。更多操作;商品入库,也需要进行授权认证,入库处理,日志记录。。。更多操作。 OOP,程序都是通过类和接口组织的,核心业务逻辑采用OOP是很合理的。但对于横跨系统中多个模块的功能需求,就比较吃力了,比如日志处理,授权验证,统一的异常处理,性能统计等 而这些都有一个共同点,都是非业务的,非业务的功能代码,从业务代码中抽离出来,独立到非业务的功能代码中,这样我们改变这些行为时,就不会影响现有的业务逻辑代码 简单来说,AOP就是将通用功能抽取出来。面向切面,就是关注通用功能,而不关注业务,而我们的OOP是关注业务的,这就是它们的区别。 AOP实现原理:预先定义一组特性,使它具有拦截方法的功能,执行方法之前和之后做你想要做的事情,而这个的拦截关卡,就是所谓的切面 过滤器,其实就是AOP的一种实现 AOP的优势: 1)、将通用功能从业务逻中抽离出来,提高代码的复用性,有利于后期的维护和扩展 2)、在软件设计时,抽出通用功能(抽出切面),降低架构的复杂度,这样在做系统时,只需要完成业务处理功能
4、AOP和OOP的区别: 1)、面向的目标不同:OOP面向的是名词领域(商品、对象、类),AOP面向的是动词领域(授权、验证、监控、埋点) 2)、思想结构不同:OOP是纵向结构,AOP是横向结构。 3)、注重的方面不同:OOP注重业务逻辑单元的划分;AOP偏重业务处理过程中某个步骤或者阶段的行为。
5、AOP和OOP的关系。 AOP其实是OOP的一个补充,它们都是编程思想,是相互弥补各自的不足,就犹如,OOP弥补POP的不足。 核心需求,仍然由OOP来实现,具体的业务,由POP来实现。而AOP就是为了让OOP更专注于业务的逻辑处理,它们都是相辅相成的
6、如何在代码里去实现AOP 这里就不过多的介绍了,实现在AOP的方式有很多种,通过设计模式就可以实现。 装饰器模式:允许向一个对象添加新的功能,同时又不改变其结构。 代理模式:一个类代表别一个类,然后向外界提供功能接口。 过滤器。
|