AOP和OOP

174 阅读3分钟

OOP(面向对象编程)

针对业务处理过程中的实体,属性,行为进行封装,以获得更加清晰高效的逻辑单元划分

OOP把对象作为程序的基本单元

特点是:封装,继承,多态

AOP(面向切面编程)

函数式编程的一种衍生范型。

通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

可以在不改变原来代码的基础上,通过“动态注入”代码,来改变原来执行结果的技术。

简单举个例子:

class Point{
		int x;
		int y;

		public Point(int x, int y) {
			this.x = x;
			this.y = y;
		}

		Point move(int dx,int dy){
			return new Point(x+dx,y+dy);
		}
	}

OOP和AOP的关系

AOP关注点是做什么,你要什么,我就给你什么。(例如我是做直径为5厘米饼干的,你给巧克力粉给我,我就给你巧克力饼干)

OOP关注点是怎么做,通过一系列的执行步骤,完成任务。(我拿着巧克力饼干,开着劳斯莱斯去妈妈家,送给她。OOP的执行单元是对象,这里是巧克力和劳斯莱斯也都是对象)

AOP并不是与OOP对立的,而是为了弥补OOP的不足。OOP解决了竖向的问题,AOP则解决横向的问题。

AOP主要应用场景

日志记录,性能统计,安全控制,事务处理,异常处理等等。

例如实现日志记录 对比:

例如:在不改变 main 方法的同时通过代码注入的方式达到目的

/**
 * Before
 */
public class Test {
    public static void main(String[] args) {
        // do something
    }
}

/**
 * After
 */
public class Test {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        // do something
        long end = System.currentTimeMillis() - start;
    }
}

AOP代码注入时机

代码注入主要注解机制,根据注解时机的不同,主要分为运行时、加载时和编译时。

运行时:你的代码对增强代码的需求很明确,比如,必须使用动态代理(这可以说并不是真正的代码注入)。

加载时:当目标类被Dalvik或者ART加载的时候修改才会被执行。这是对Java字节码文件或者Android的dex文件进行的注入操作。

编译时:在打包发布程序之前,通过向编译过程添加额外的步骤来修改被编译的类。aspect切面编程正是运用到编译时

AOP的几种实现方式

Java 中的动态代理,运行时动态创建 Proxy 类实例 APT,注解处理器,编译时生成 .java 代码 Javassist for Android:一个移植到Android平台的非常知名的操纵字节码的java库,对 class 字节码进行修改 AspectJ:和Java语言无缝衔接的面向切面的编程的扩展工具(可用于Android)。

Android中使用 AspectJ

代表项目:Hugo(打印每个方法的执行时间) sa-sdk-android(全埋点技术)

AOP与OOP有什么区别,谈谈AOP的原理是什么

什么是函数式编程思维?