js设计模式之(解释器模式)

解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析.符号处理引擎等。

介绍

意图:

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

主要解决:

对于一些固定文法构建一个解释句子的解释器。

何时使用:

如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

如何解决:

构建语法树,定义终结符与非终结符。

关键代码:

构建环境类,包含解释器之外的一些全局信息,一般是 HashMap。

应用实例:

编译器.运算表达式计算。

优点:

  1. 可扩展性比较好,灵活。
  2. 增加了新的解释表达式的方式。
  3. 易于实现简单文法。

缺点:

  1. 可利用场景比较少。
  2. 对于复杂的文法比较难维护。
  3. 解释器模式会引起类膨胀。
  4. 解释器模式采用递归调用方法。

使用场景:

  1. 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  2. 一些重复出现的问题可以用一种简单的语言来进行表达。
  3. 一个简单语法需要解释的场景。

作业:

用解释器模式为公司安排一场面试

  • 条件1:>18
  • 条件2:学历>=xxx

AbstractMethodError.js

export default class AbstractMethodError extends Error {
    constructor() {
        super("this method should be overried");
        this.name = "AbstractMethodError";
    }
}

AgeCondition.js

import Condition from "./Condition";

export default class AgeCondition extends Condition {
    expression(user) {
        if (user.age > 18) {
            return true;
        } else {
            console.log(`对不起,${user.name}! 您年龄不满足`);
            return false;
        }
    }
}

AndCondition.js

import Condition from "./Condition";

export default class AndCondition extends Condition {
    constructor(...conditions) {
        super();
        this.conditions = conditions;
    }

    expression(user) {
        let pass = true;
        this.conditions.forEach((condition) => {
            if (!new condition().expression(user)) {
                pass = false;
            }
        });
        if (pass) {
            console.log(`您好:${user.name} 恭喜您! 您很符合我们公司要求`);
        }
    }
}

Condition.js

import AbstractMethodError from "./AbstractMethodError";

export default class Condition {
    expression() {
        throw new AbstractMethodError();
    }
}

EduCondition.js

import Condition from "./Condition";

export default class EduCondition extends Condition {
    expression(user) {
        if (user.education >= 2) {
            return true;
        } else {
            console.log(`对不起,${user.name}! 您学历不满足`);
            return false;
        }
    }
}

测试demo:

import AgeCondition from "./src/AgeCondition";
import EduCondition from "./src/EduCondition";
import AndCondition from "./src/AndCondition";

export default {
    name: 'page-InterpreterPattern',
    created() {
        const andCondition = new AndCondition(AgeCondition, EduCondition);

        //age>18 education>=2
        let user1 = {
            name: "小明",
            age: "17",
            education: 2,
        };
        let user2 = {
            name: "小黑",
            age: "20",
            education: 1,
        };
        let user3 = {
            name: "小白",
            age: "21",
            education: 3,
        };
        andCondition.expression(user1);
        andCondition.expression(user2);
        andCondition.expression(user3);
    }
};

参考:

https://www.runoob.com/design-pattern/design-pattern-tutorial.html

发布了128 篇原创文章 · 获赞 113 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/vv_bug/article/details/103861114