缩写:AOP(Aspect Oriented Programming)
定义
面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming, OOP)技术的一种延续,是当前软件开发中比较流行的技术。相对于OOP提倡的对象继承关系,AOP针对业务处理过程中的某一个阶段作为切入点,为多个没有继承关系的对象,在执行到切入点时引入统一的处理机制或方法从而降低逻辑过程中各阶段之间的耦合。
AOP不会破坏现有对象已经实现的继承关系和接口定义,如果将OOP的继承看作是对象间的“纵向”关系,那么AOP更像是“横向”的切割关系,为编程提供了另外一种设计思路。AOP可以将通用功能从业务逻辑中抽离出来进行统一处理,省略大量重复代码,利于代码的维护。
在java或C#语言中,AOP通常可以分成静态AOP和动态AOP方式。
——静态AOP实现通常采用装饰器模式或代理模式实现。
例如:
public interface ICommandProcessor
{
void Process(string command);
}
public class CommandProcessor : ICommandProcessor
{
public CommandProcessor()
{
Console.WriteLine("构造函数执行了");
}
public void Process (string command)
{
Console.WriteLine($"主要业务逻辑,处理command:{command}");
}
}
/// <summary>
/// 通过装饰器模式提供AOP
/// </summary>
public class CommandProcessorDecorator : ICommandProcessor
{
private ICommandProcessor _commandProcessor { get; set; }
public CommandProcessorDecorator(ICommandProcessor commandProcessor)
{
this._commandProcessor = commandProcessor;
}
public void Process (string command)
{
this.BeforeProceed(command);
this._commandProcessor.ReadInfo(command);
this.AfterProceed(command);
}
/// <summary>
/// 业务逻辑之前
/// </summary>
private void BeforeProceed(string command)
{
Console.WriteLine("command执行前");
}
/// <summary>
/// 业务逻辑之后
/// </summary>
private void AfterProceed(string command)
{
Console.WriteLine("command执行后");
}
}
调用代码:
public static void Execute()
{
///需要对多个类进行切面的时候,可以为每个类创建各自的Decorator
ICommandProcessor processor = new CommandProcessorDecorator(processor);
processor.Process("DoSomething");
}
如上的实现方法实用性不强,在流程的java或C#编程中,通常采用动态AOP方式。
动态AOP通常依赖于编程语言的反射机制,面向接口动态创建类的代理类,代理类和其代理的类需要实现完全相同的接口,在面向类的函数调用前后插入额外的处理方法,执行切入逻辑。在java和C#编程中,动态代理类的创建往往又通过依赖注入框架在后台自动实现,使用者配置AOP后,通过依赖注入获取到的对象实例是框架自动创建的代理类。这种机制极大的降低了使用者实现AOP机制的难度,结合定制特新等语言机制,使得AOP技术变得流行。
应用
- 操作日志
面向用户操作如登录、登出、执行等,自动的记录操作日志。
- 缓存
针对请求频率高,但请求返回变化不太频繁的函数调用,通过AOP将请求和返回结果记录在缓存中,按照缓存策略,一定时间内相同的请求直接从缓存中返回处理结果,并不重复执行逻辑运算。
- 异常处理
针对特定操作的异常进行统一捕获和处理,并统一的进行异常处理结果的提醒和UI交互。
参考文献
[1] 百度百科https://baike.baidu.com/item/AOP/1332219