美文网首页工作生活
第十七章 解释器模式(Interpreter Pattern)

第十七章 解释器模式(Interpreter Pattern)

作者: 穹生变 | 来源:发表于2019-07-02 17:07 被阅读0次

    1.简介

    • 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
    • 解释器模式是一种行为型模式。

    2.场景

    1、正则表达式、编译器、运算表达式计算。
    2、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
    3、一些重复出现的问题可以用一种简单的语言来进行表达。
    4、一个简单语法需要解释的场景。

    3.优缺点

    优点:

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

    缺点:

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

    4. 图片模型

    image.png

    5. 代码实现

    1、创建一个表达式接口

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

    2、创建实现了上述接口的实体类

    public class TerminalExpression implements Expression {
       
       private String data;
     
       public TerminalExpression(String data){
          this.data = data; 
       }
     
       @Override
       public boolean interpret(String context) {
          if(context.contains(data)){
             return true;
          }
          return false;
       }
    }
    public class OrExpression implements Expression {
        
       private Expression expr1 = null;
       private Expression expr2 = null;
     
       public OrExpression(Expression expr1, Expression expr2) { 
          this.expr1 = expr1;
          this.expr2 = expr2;
       }
     
       @Override
       public boolean interpret(String context) {      
          return expr1.interpret(context) || expr2.interpret(context);
       }
    }
    public class AndExpression implements Expression {
        
       private Expression expr1 = null;
       private Expression expr2 = null;
     
       public AndExpression(Expression expr1, Expression expr2) { 
          this.expr1 = expr1;
          this.expr2 = expr2;
       }
     
       @Override
       public boolean interpret(String context) {      
          return expr1.interpret(context) && expr2.interpret(context);
       }
    }
    

    3、创建规则,并解析它们

    public class InterpreterPatternDemo {
     
       //规则:Robert 和 John 是男性
       public static Expression getMaleExpression(){
          Expression robert = new TerminalExpression("Robert");
          Expression john = new TerminalExpression("John");
          return new OrExpression(robert, john);    
       }
     
       //规则:Julie 是一个已婚的女性
       public static Expression getMarriedWomanExpression(){
          Expression julie = new TerminalExpression("Julie");
          Expression married = new TerminalExpression("Married");
          return new AndExpression(julie, married);    
       }
     
       public static void main(String[] args) {
          Expression isMale = getMaleExpression();
          Expression isMarriedWoman = getMarriedWomanExpression();
     
          System.out.println("John is male? " + isMale.interpret("John"));
          System.out.println("Julie is a married women? " 
          + isMarriedWoman.interpret("Married Julie"));
       }
    }
    

    4、执行程序,输出结果

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

    相关文章

      网友评论

        本文标题:第十七章 解释器模式(Interpreter Pattern)

        本文链接:https://www.haomeiwen.com/subject/sxdthctx.html