AOP与OOP的比较

AOP面向切面编程

常用OOP对比理解:纵向关系OOP,横向关系AOP
举个例子
设计一个日志打印模板,OOP模式
设计一个打印日志LogUtils类,然后再需要打印的地方引用即可

public class ClassA{
	private void initView(){
		LogUtils.d(TAG,"onInitView");
	}
}

public class ClassB{
	private void onDataComplete(Bean bean){
		LogUtils.d(TAG,bean.attribute);
	}
}

public ClassC{
	private void onError(){
		LogUtils.e(TAG,"onError");
	}
}

但是这个类是横跨并嵌入众多模块里的,在各个模块里分散的很厉害,到处都能见到。从对象组织角度来讲,我们一般采用的分类方法都是使用类似生物学分类的方法,用继承关系为主线,我们称之为纵向,也就是OOP。设计时只使用OOP思想可能会带来两个问题:
对象设计的时候一般都是纵向思维,如果这个时候考虑这些不同类对象的共性,不仅会增加设计的难度和复杂性,还会造成类的接口过多而难以维护(共性越多,意味着接口契约越多)。

需要对现有的对象 动态增加 某种行为或责任时非常困难

AOP例子:只需要声明哪些方法需要打印log,打印什么内容

public class ClassA{
	@log(msg = "onInitView"private void initView(){
	}
}

public class ClassB {
    @Log(msg = "bean.attribute")
    private void onDataComplete(Bean bean) {
    }
}

public class ClassC {
    @Log(msg = "onError")
    private void onError() {
    }
}

OOP 是把问题划分到单个模块的话,那么 AOP 就是把涉及到众多模块的某一类问题进行统一管理。AOP的目标是把这些功能集中起来,放到一个统一的地方来控制和管理。利用 AOP 思想,这样对业务逻辑的各个部分进行了隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。
在这里插入图片描述

OOP和AOP的区别
1.面向目标不同,简单来说OOP是面向名词领域,AOP面向动词领域
2.思想结构不同,纵向和横向
3.注重方面不同,OOP注重业务逻辑单元的划分,AOP偏重业务处理过程中的某个步骤和阶段

两者之间是一个互相补充和完善的关系

AOP应用场景
1.参数校验和判空
2.Android API23+的权限控制
3.无痕埋点
4.安全控制
5.日志记录

总结
AOP 重在理解这种思想:

先考虑要在什么期间插入代码,选用合适的 AOP 方法;
找准切入点也就是代码可注入的点,比如一个方法的调用处或者方法内部;
接着考虑怎么过滤方法,找到注入点的描述,比如注入到所有onClick方法:call(* view.onClick(…));
接着要考虑以怎样的方式处理代码,是在代码执行前?执行后?还是包裹代码?还是替换目标代码?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值