前言

首先我们需要知道的是AOP是一种思想,而不是那种语句特有的,它可以克服那些只有单继承特性语言的缺点(比如Java,后面会有实例进行讲解)

区别:

  • OOP(Object Oriented Programming)

    面向对象编程是针对业务处理过程的实体及其属性和行为进行抽象封装>的一种编程方法。

    OOP的目的就是获得更加清晰高效的逻辑单元划分

  • AOP(Aspect Oriented Programming)

    面向切面编程是针对业务处理过程中的切面进行提取操作,是处理过程中的某个步骤或阶段的一种编程方法。

    AOP的目的是为了获得逻辑过程中各部分之间低耦合的隔离效果

正文

对某一个业务实体的封装——OOP

对某一个过程的处理,例如“权限检查”——AOP,这里我们可以拿前端中的路由守卫进行说明。

每当页面跳转和刷新时都会走下面这个方法去检查本地数据中是否存在token值,从而进行不同的操作。
关于OOP与AOP的思想浅析
OOP面向名词领域:猫(属性+行为)、狗(属性+行为)、领导(属性、行为)

AOP面向动词领域:权限检查、日志记录、监控等

实例:并发访问

假设有一个共享数据在同一时间内需要多个用户访问,那我们首先需要将这个数据利用OOP的思想封装到一个数据对象中,命名为:Data;然后我们需要创建几个访问这个对象的类。

如果我们要实现并发访问,我们需要引入“锁”的概念,在一个类访问数据时将该数据上锁,等该类释放数据后,再立刻解锁供其他类访问,如下图所示。
关于OOP与AOP的思想浅析
此时我们用OOP的思想创建一个抽象类作为父类,让所有的访问类都继承这个父类。
关于OOP与AOP的思想浅析
这时我们会发现,每一个访问类中都有关于锁状态的代码,而是这些代码只有在跟锁有关的场合才会有其作用。不仅如此,又因为Java只提供单一继承,所以这些访问类不能再继承其他的父类,也就是说不能再有其他的需求可谈。

如果我们用AOP的思想去看待这个问题,可以发现如下几个问题:

1.在每个访问类中锁的功能不是主要功能

2.在每一个类要访问数据之前都会用到锁,在访问这个过程中,锁就像一道关卡横在了访问类与访问数据之间。
关于OOP与AOP的思想浅析
因此产生了一个新的程序结构,该程序结构关注的是系统的纵向切面,如上图中的锁一样,而这个新的程序结构就是我们所讲的AOP中的Aspect(方面)。

不知道大家是否从上面的例子中体会到:其实AOP是一个从更抽象的概念来理解我们的系统的。

在搜索资料的过程中看到一句话感觉很好,在这里跟大家分享一下:

如果说面向对象编程关注的是将需求功能划分为不同的并且相对独立,封装良好的类,并让她们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;那么面向切面编程则是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需修改这个行为即可。

结尾

针对徒弟提出的问题:
关于OOP与AOP的思想浅析
公共行为应用于多个无关对象模型之间是OOP的弱点,也说明了这正是AOP所解决的问题,OOP正是因为其面向的是对象,在上面的实例中也很鲜明地体现了,当我们在用OOP去设置一个Lock的时候,每个类中都有相同的代码(且复用率低),而且再也无法继承其他类,不仅代码冗余还使其不可拓展不够灵活。所以说对于公共行为应用于多个无关对象模型之间是OOP的一个弱点,不过AOP弥补了OOP的不足。

以上这些就是对OOP和AOP的简单讲述,希望读后让你有所了解,本人也是初次学习欢迎交流。

相关文章: