美文网首页
解释器模式(Interpreter)

解释器模式(Interpreter)

作者: jiahzhon | 来源:发表于2020-03-11 11:14 被阅读0次

    - 定义

    • 给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。

    - 缺点

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

    - 缺点

    • 解释器模式的结构与组合模式相似,不过其包含的组成元素比组合模式多,而且组合模式是对象结构型模式,而解释器模式是类行为型模式。

    - 主要角色

    • 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
    • 终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
    • 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
    • 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
    • 客户端(Client):主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。

    - 结构图

    3-1Q119150626422.gif

    - 代码实现

    //抽象表达式类
    interface AbstractExpression
    {
        public Object interpret(String info);    //解释方法
    }
    //终结符表达式类
    class TerminalExpression implements AbstractExpression
    {
        public Object interpret(String info)
        {
            //对终结符表达式的处理
        }
    }
    //非终结符表达式类
    class NonterminalExpression implements AbstractExpression
    {
        private AbstractExpression exp1;
        private AbstractExpression exp2;
        public Object interpret(String info)
        {
            //非对终结符表达式的处理
        }
    }
    //环境类
    class Context
    {
        private AbstractExpression exp;
        public Context()
        {
            //数据初始化
        }
        public void operation(String info)
        {
            //调用相关表达式类的解释方法
        }
    }
    

    - 代码实现

    • 公交车读卡器可以判断乘客的身份,如果是“韶关”或者“广州”的“老人” “妇女”“儿童”就可以免费乘车,其他人员乘车一次扣 2 元。
    /*文法规则
      <expression> ::= <city>的<person>
      <city> ::= 韶关|广州
      <person> ::= 老人|妇女|儿童
    */
    public class InterpreterPatternDemo
    {
        public static void main(String[] args)
        {
            Context bus=new Context();
            bus.freeRide("韶关的老人");
            bus.freeRide("韶关的年轻人");
            bus.freeRide("广州的妇女");
            bus.freeRide("广州的儿童");
            bus.freeRide("山东的儿童");
        }
    }
    //抽象表达式类
    interface Expression
    {
        public boolean interpret(String info);
    }
    //终结符表达式类
    class TerminalExpression implements Expression
    {
        private Set<String> set= new HashSet<String>();
        public TerminalExpression(String[] data)
        {
            for(int i=0;i<data.length;i++)set.add(data[i]);
        }
        public boolean interpret(String info)
        {
            if(set.contains(info))
            {
                return true;
            }
            return false;
        }
    }
    //非终结符表达式类(模拟“和”这个逻辑)
    class AndExpression implements Expression
    {
        private Expression city=null;    
        private Expression person=null;
        public AndExpression(Expression city,Expression person)
        {
            this.city=city;
            this.person=person;
        }
        public boolean interpret(String info)
        {
            String s[]=info.split("的");       
            return city.interpret(s[0])&&person.interpret(s[1]);
        }
    }
    //环境类
    class Context
    {
        private String[] citys={"韶关","广州"};
        private String[] persons={"老人","妇女","儿童"};
        private Expression cityPerson;
        public Context()
        {
            Expression city=new TerminalExpression(citys);
            Expression person=new TerminalExpression(persons);
            cityPerson=new AndExpression(city,person);
        }
        public void freeRide(String info)
        {
            boolean ok=cityPerson.interpret(info);
            if(ok) System.out.println("您是"+info+",您本次乘车免费!");
            else System.out.println(info+",您不是免费人员,本次乘车扣费2元!");   
        }
    }
    

    相关文章

      网友评论

          本文标题:解释器模式(Interpreter)

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