博客> 面向切面编程,Aspects简介与简单使用
面向切面编程,Aspects简介与简单使用
2018-10-17 16:31 评论:0 阅读:1149 lvhahaha
面向切面编程 Aspects

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

Aspects github地址:https://github.com/steipete/Aspects.git

把某些方面看作是在使用类固定的方法。它允许您将代码添加到每个类或每个实例的现有方法中,同时考虑插入点,例如前/脚/后/后。方面自动处理调用super,比常规方法更容易使用。

 屏幕快照 2018-02-06 下午5.47.57.png

这个图片所显示的就是Aspects的接口调用的。 1、aspect_hookSelector:表示要拦截指定对象的方法。 2、withOptions:是一个枚举类型,AspectPositionAfter表示viewDidLoad方法执行后会触发usingBlock:的代码。 3、usingBlock:就是拦截事件后执行的自定义方法。我们可以在这个block里面添加我们要执行的代码。

上面的代码运行可以看出,只要任何控制器对象或者其子类的viewDidLoad方法触发,doSomethings方法就会触发。

添加方面会返回一个不透明的类型方面令牌符号,该令牌可以再次用于deregister。所有调用都是线程安全的。

方面使用objective-c转发来连接到消息。这会造成一些开销。不要向被称为“很多”的方法添加方面。方面的意思是视图/控制器代码,它不被称为每秒1000次。

方面调用和匹配块参数。没有参数的块也得到了支持。第一个块参数将是类型id的类型。

使用场景1:比如你的app要进行用户行为app的浏览痕迹,则可以在ViewController中的viewWillAppear和viewWillDisAppear进行方法拦截。ViewController可以是自己创建的基类。

[UIViewController aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionAfter usingBlock:^(id aspectInfo, BOOL animated) { NSLog(@"View Controller %@ will appear animated: %tu", aspectInfo.instance, animated); } error:NULL];

这种方法可以使用自定义类并重写+ load方法来实现功能,所有以前写的代码不用修改一行,只需继承自UIViewController就可实现功能,这种思想有个专业术语叫AOP,即面向切片编程。

使用场景2:比如你自定义了一个menuView,菜单栏上的事件也可以进行拦截,简单实用。

 屏幕快照 2018-02-06 下午6.03.50.png

demo地址:https://github.com/qindeli/AspectsInstruction

上面方法可以减少类与类的耦合度,我们可以在不设置回调的情况下就能很方便的满足需求。有时候,回调很多或者嵌套对我们处理某些问题带来很多麻烦。总之我们采用的任何处理方式或者设计模式等方案,都需要考虑尽量减少类与类之间的耦合,使类更好用

Aspects确实是一个很强大的类,特别对于有添加日志、统计等需求项目来说带来了方便,就不需要我们在每个类里面添加相同的代码,因为添加的这些代码与当前类的业务关联不是很大。

收藏
2
sina weixin mail 回到顶部