面向切面编程(AOP)
一、概念
Aspect Oriented Programming(AOP),译作面向切面编程/面向方面的程序设计/剖面导向程序设计
1、对OOP(面向对象编程)的一个横向的补充
2、是面向切面软件开发的基础
3、其中“通知”是切面的具体实现,分为before(前置通知)、after(后置通知)、around(环绕通知)
二、应用目的
针对业务处理过程中的的某个步骤或阶段进行切面提取,抽离于业务无关的功能,用**“动态”插入的方式嵌到各业务逻辑中,以降低逻辑过程中各部分之间的低耦合**性,并提高特定切面处理逻辑功能的复用性。
同时,在清晰业务逻辑的同时,减弱编程时的逻辑分支复杂度,只需考虑主流程,而无需考虑那些不重要的流程。
三、应用场景
主要业务场景:日志打印、统计数据、数据验证、安全控制、异常处理等等。
前端框架使用:dojo和yui3中AOP被提升至自定义事件的一种内在机制
四、图示解析
五、基本代码实现
const Decorator = {
before(decor, target) {
return () => {
decor.apply(target, arguments);
return target.apply(target, arguments);
};
},
after(decor, target) {
return () => {
const result = target.apply(target, arguments);
decor.apply(target, arguments);
return result;
};
},
around(decor, target) {
return () => {
decor.apply(target, arguments);
const result = target.apply(target, arguments);
decor.apply(target, arguments);
return result;
};
}
};
function sayHello() {
console.info('hello')
}
sayHello = Decorator.before(() => {
console.info('before say hello');
}, sayHello);
sayHello = Decorator.after(() => {
console.info('after say hello');
}, sayHello);
sayHello = Decorator.around(() => {
console.info('around say hello');
}, sayHello);
sayHello();
输出:
1. around say hello
2. before say hello
3. hello
4. after say hello
5. around say hello