面向切面编程(AOP)

一、概念

Aspect Oriented Programming(AOP),译作面向切面编程/面向方面的程序设计/剖面导向程序设计

1、对OOP(面向对象编程)的一个横向的补充

2、是面向切面软件开发的基础

3、其中“通知”是切面的具体实现,分为before(前置通知)、after(后置通知)、around(环绕通知)

二、应用目的

针对业务处理过程中的的某个步骤或阶段进行切面提取,抽离于业务无关的功能,用**“动态”插入的方式嵌到各业务逻辑中,以降低逻辑过程中各部分之间的低耦合**性,并提高特定切面处理逻辑功能的复用性。

同时,在清晰业务逻辑的同时,减弱编程时的逻辑分支复杂度,只需考虑主流程,而无需考虑那些不重要的流程。

三、应用场景

主要业务场景:日志打印、统计数据、数据验证、安全控制、异常处理等等。

前端框架使用:dojoyui3中AOP被提升至自定义事件的一种内在机制

四、图示解析

面向切面编程(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

六、相关资料

面向切面编程

轻松理解AOP思想(面向切面编程)

Javascript aop(面向切面编程)之around(环绕)

面向切面的程序设计

用AOP来让你的JS代码变得更有可维护性吧

Javascript 中的 AOP

用AOP改善javascript代码

JavaScript实现AOP(面向切面编程,装饰者模式)