解释器模式

作者: ppamos | 来源:发表于2019-07-15 21:41 被阅读0次

    优点

    • 解释器模式是一种类行为型模式,其主要优点如下。
      扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
      容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。

    缺点

    • 解释器模式的主要缺点如下。
      执行效率较低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。
      会引起类膨胀。解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
      可应用的场景比较少。在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到。

    代码

    • 抽象的表达式角色
            public interface Expression
              {
            public boolean interpret(String info);
            }
    
    • 终结符表达式类
              public class TerminalExpression implements Expression
        {
            public Set<String> interpretSet = new HashSet<>();
    
          @Override
          public boolean interpret(String info)
          {
              if(interpretSet.contains(info))
                  return true;
              else
                  return false;
          }
          public void inject(String[] newInfos){
              if(newInfos!=null)
              {
                 for(String var1 : newInfos)
                  {
                      interpretSet.add(var1);
                  }
              }
    
          }
          }
    
    • 非终结符表达式
    public class AndExpression implements  Expression
    {
        Expression city=null;
        Expression person=null;
        public AndExpression(Expression city,Expression person){
            this.city=city;
            this.person=person;
        }
        @Override
        public boolean interpret(String info)
        {
            String[] var1 = info.split("的");
            return city.interpret(var1[0])&&person.interpret(var1[1]);
        }
    }
    
    • 环境类
    public class Context
    {
       private String[] citys={"韶关","广州"};
       private String[] persons={"老人","妇女","儿童"};
       private Expression andExpression;
        public Context(){
            Expression city = new TerminalExpression();
            Expression person = new TerminalExpression();
            ((TerminalExpression) city).inject(citys);
            ((TerminalExpression) person).inject(persons);
             andExpression = new AndExpression(city, person);
    
        }
        public String freeRide(String info){
            boolean ok = andExpression.interpret(info);
            if(ok)
                return "你是"+info+"本次免费";
           return info+",您不是免费人员,本次乘车扣费2元!";
        }
    }
    
    • 测试类
    public class Demo06
    {
        public static void main(String[] args)
        {
            Context context = new Context();
            String var1 = context.freeRide("广州的年轻人");
            System.out.println(var1);
        }
    }
    
    • 输出
    广州的年轻人,您不是免费人员,本次乘车扣费2元!
    

    相关文章

      网友评论

        本文标题:解释器模式

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