解释器模式

优点

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

缺点

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

代码

  • 抽象的表达式角色
        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元!
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容