行为型模式——解释器模式(Interpreter Pattern)

解释器模式( Interpreter Pattern)

**解释器模式(Interpreter Pattern)**属于行为型模式。

什么是解释器模式(Interpreter Pattern)?

这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

UML

解释器模式

角色
  • 抽象表达式(IExpression)角色:负责定义一个解释方法,并交由具体子类进行具体解释。
  • 终结符表达式(TerminalExpression)角色:实现文法中与终结符有关的解释操作,该操作可以理解为最底层的解释逻辑,不再下钻。通常一个解释器中只有一个终结符表达式,但有多个实例,对应不同的终结符。
  • 非终结符表达式(NonterminalExpression)角色:实现文法中与非终结符有关的解释操作(过程逻辑),通常会进行解析并继续下钻调用,直到终结符表达式。
  • 上下文环境类(Context)角色:包含解释器之外的全局信息。它一般用来存放文法中各个终结符所对应的具体值。
应用
使用模板

//client
public class InterpreterPattern {
    public static void main(String[] args) {
        Context context = new Context();
        context.operation("被解析数据");
    }
}

//抽象表达式
interface IExpression {
    //定义通用的表达式接口
    Object interpret(String info);
}

//终结符表达式
class TerminalExpression implements IExpression {
    //定义终结符解析逻辑
    @Override
    public Object interpret(String info) {
        return "【终结符表达式】正在对(" + info + ")执行最终解析...\n" + "解析完毕!";
    }
}

//非终结符表达式
class NonTerminalExpression implements IExpression {
    private final IExpression expression;
    //设置其他表达式
    public NonTerminalExpression(IExpression expression) {
        this.expression = expression;
    }
    //定义非终结符表达式解析逻辑
    @Override
    public Object interpret(String info) {
        System.out.println("【非终结符表达式】解析中...");
        return expression.interpret(info);
    }
}

//上下文
class Context {
    private final IExpression expression;
    //设置具体表达式逻辑
    Context() {
        expression = new NonTerminalExpression(new TerminalExpression());
    }
    //执行解析操作
    public void operation(String info) {
        System.out.println(expression.interpret(info));
    }
}

为什么要使用解释器模式?

在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,便可以用解释器模式来实现。

优缺点
优点:
  1. 解析逻辑可扩展性比较好,灵活。
  2. 易于实现简单文法。
缺点:
  1. 可利用场景比较少。
  2. 对于复杂的文法比较难维护。过于复杂的语法并不适合解释器模式。
  3. 解释器模式会引起类膨胀。过多的解析式会让解析器有过多的类。
  4. 解析速度较慢,解释器模式采用递归调用方法。

怎样使用解释器模式?

使用较少,可以使用jep进行设计

使用场景
  • 当语言的文法较为简单,且执行效率不是关键问题时。
  • 一些重复出现的问题可以用一种简单的语言进行表达。
  • 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树。
使用拓展

慎入!!!代码不小心跑起来的加减乘除的使用

jep的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值