23种设计模式之解释器模式

发布于:2024-12-09 ⋅ 阅读:(146) ⋅ 点赞:(0)

1. 简介

解释器模式(Interpreter Pattern) 是一种行为设计模式。它给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
例如,对于一个简单的数学表达式语言,如 “3 + 4”,解释器模式可以用来解析和计算这个表达式。它把表达式拆分成数字和运算符等语法元素,然后按照一定的规则进行解释和计算。

解释器模式的结构

  • 抽象表达式(Abstract Expression)类
    这是所有具体表达式类的父类,它声明了一个抽象的解释方法。
  • 终结符表达式(Terminal Expression)类
    终结符表达式是文法中的终结符,它不能再被分解。在数学表达式中,数字就是终结符表达式。它实现了抽象表达式类中的解释方法,用于返回自身的值。
  • 非终结符表达式(Non - terminal Expression)类
    非终结符表达式包含一个或多个表达式,可以对包含的表达式进行操作。在数学表达式中,加法、减法等运算符对应的表达式就是非终结符表达式。它们通过调用子表达式的解释方法来实现自身的解释。
  • 客户端(Client)类
    客户端类负责构建表达式的抽象语法树,并调用解释器来解释表达式。

2. 代码

2.1 Expression (抽象表达式类)

public interface Expression {
    public boolean interpret(String context);
}

2.2 TerminalExpression (终结符表达式类)

public class TerminalExpression implements Expression{
    private String data;

    public TerminalExpression(String data)
    {
        this.data = data;
    }

    public boolean interpret(String context)
    {
        if(context.contains(data))
            return true;
        else
            return false;
    }
}

2.3 OrExpression (非终结符表达式类)

public class OrExpression implements Expression{
    private Expression expression1;
    private Expression expression2;

    public OrExpression(Expression expression1, Expression expression2)
    {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String context)
    {
        return expression1.interpret(context) || expression2.interpret(context);
    }
}

2.4 AndExpression (非终结符表达式类)

public class AndExpression implements Expression{
    private Expression expression1;
    private Expression expression2;

    public AndExpression(Expression expression1, Expression expression2)
    {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String context)
    {
        return expression1.interpret(context) && expression2.interpret(context);
    }
}

2.5 Test (客户端类)

public class Test {
    public static void main(String[] args) {
        Expression isMale = new TerminalExpression("male");
        Expression isMarriedWoman = new AndExpression(new TerminalExpression("married"),
                new TerminalExpression("woman"));
        System.out.println("John is male? " + isMale.interpret("John male"));
        System.out.println("Julie is a married women? " + isMarriedWoman.interpret("married woman"));
        System.out.println("Jake is a married women? " + isMarriedWoman.interpret("married man"));
    }
}

2.6 运行结果

John is male? true
Julie is a married women? true
Jake is a married women? false

3. 优缺点

  • 解释器模式的优点
    • 易于实现简单的语言解释器
      对于一些简单的特定领域语言(DSL),如简单的配置文件语法或者简单的数学表达式语言,解释器模式可以很方便地实现解析和执行。
    • 灵活性好
      可以方便地修改和扩展语法规则。如果要添加新的运算符或者语法元素,只需要创建新的表达式类并修改相应的解释逻辑即可。
  • 解释器模式的缺点
    • 复杂语法难以维护
      当语言的文法变得复杂时,解释器模式会导致大量的类,而且语法规则的维护和修改会变得非常困难。例如,对于一个完整的编程语言,使用解释器模式来实现整个语法解析和执行会非常复杂。
    • 效率可能较低
      解释器模式通常采用递归调用等方式来解释表达式,对于复杂的表达式或者大量的表达式解释,可能会导致性能问题,比如占用较多的内存和计算资源。

4. 总结


网站公告

今日签到

点亮在社区的每一天
去签到