说明器方式概念

说明器方式(Interpreter Pattern)是一种对象行为型方式,它定义了一种言语文法并且建立一个说明器来说明该言语中的句子。在说明器方式中,文法和说明器都是经过类来标明的,说明器方式首要用于对凌乱的言语解析或许一些专业化的领域言语的处理

说明器方式的中心是说明器类,在说明器方式中一般会定义两种说明器:

终结符说明器(Terminal Expression Interpreter):终结符说明器用于说明言语中的基本单位,对应语法树中的叶子节点,比如变量、常量等。

非终结符说明器(Nonterminal Expression Interpreter):非终结符说明器用于说明一个语法规则,对应语法树中的非叶子节点,比如算术表达式、逻辑表达式等。

怎么运用说明器方式

在说明器方式中,我们先即将说明的句子抽象成一个语法树,然后运用递归算法在语法树上进行说明。整个说明进程就相当于不断地对语法树进行遍历,并将每个节点依照特定的规则进行说明。

说明器方式优缺陷

说明器方式的长处是可以扩展语法规则,只需求添加相应的说明器即可,而不需求批改已有的说明器。可是,说明器方式的缺陷也很明显,因为每个语法规则都需求对应一个说明器,因而说明器方式在解析凌乱句子时会构成类胀大和系统功用下降

说明器方式事例

假设我们现在需求规划一个简略的四则运算言语,完结加减乘除的操作。

完结进程如下:

首要,我们需求定义一个抽象的表达式接口 Expression,其间定义了 interpret() 方法,用于说明表达式。具体的四则运算符则分别对应非终结符说明器 AddExpression、SubtractExpression、MultiplyExpression 和 DivideExpression。而数字则是终结符说明器 NumberExpression。在每个说明器类中,都需求完结 interpret() 方法来说明相应的表达式。

代码如下:

// 表达式接口
public interface Expression {
    int interpret();
}
// 加法说明器
public class AddExpression implements Expression {
    private Expression left;
    private Expression right;
    public AddExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    @Override
    public int interpret() {
        return left.interpret() + right.interpret();
    }
}
// 减法说明器
public class SubtractExpression implements Expression {
    private Expression left;
    private Expression right;
    public SubtractExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    @Override
    public int interpret() {
        return left.interpret() - right.interpret();
    }
}
// 乘法说明器
public class MultiplyExpression implements Expression {
    private Expression left;
    private Expression right;
    public MultiplyExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    @Override
    public int interpret() {
        return left.interpret() * right.interpret();
    }
}
// 除法说明器
public class DivideExpression implements Expression {
    private Expression left;
    private Expression right;
    public DivideExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    @Override
    public int interpret() {
        try {
            return left.interpret() / right.interpret();
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
            return -1;
        }
    }
}
// 数字说明器
public class NumberExpression implements Expression {
    private int number;
    public NumberExpression(int number) {
        this.number = number;
    }
    @Override
    public int interpret() {
        return number;
    }
}

现在我们可以运用这些类来解析四则运算表达式了。例如,对于表达式 “1 + 2 * 3 – 4 / 2″,其语法树如下所示:

/ \
  • /
    / \ |
    1 * 2
    /
    3 /
    |
    4

我们可以运用以下代码来解析该表达式:

Expression expression = new SubtractExpression(
                                new AddExpression(
                                    new NumberExpression(1),
                                    new MultiplyExpression(
                                        new NumberExpression(2),
                                        new NumberExpression(3)
                                    )
                                ),
                                new DivideExpression(
                                    new NumberExpression(4),
                                    new NumberExpression(2)
                                )
                            );
int result = expression.interpret();
System.out.println("计算成果为:" + result);

输出成果为:

计算成果为:6

以上示例只是一个简略的示例,实践使用中会愈加凌乱。可是中心思想是一致的,便是将言语进行解析并最终得到成果。

说明器方式小结

说明器方式在实践开发中的使用场景并不是特别广泛,首要用于一些特定领域的言语解析,比如正则表达式、数学公式解析等

好了,本篇文章就先共享到这儿了,后续将会继续介绍23种规划方式之其他方式,感谢大佬仔细读完支撑咯~