zoukankan      html  css  js  c++  java
  • 设计模式之美学习-行为型-解释器模式(三十五)

    什么是解释器模式

    解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法

    需求

    如“韶粵通”公交车读卡器可以判断乘客的身份,如果是“韶关”或者“广州”的“老人” “妇女”“儿童”就可以免费乘车,其他人员乘车一次扣 2 元。

    表达式

    <expression> ::= <city>的<person> //分隔符
    <city> ::= 韶关|广州  //城市
    <person> ::= 老人|妇女|儿童  //对象

    代码实现

    package interpreterPattern;
    import java.util.*;
    /*文法规则
      <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("山东的儿童");
        }
    }
    //抽象表达式类
    //定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
    interface Expression
    {
        public boolean interpret(String info);
    }
    //终结符表达式(Terminal    Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应
    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;
        }
    }
    //非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
    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]);
        }
    }
    //环境类环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
    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元!");
        }
    }

    说明

    解释器模式在实际的系统开发中使用的非常少,因为它会引起效率、性能以及维护等问题,一般在大中型的框架型项目能够找到它的身影,比如一些数据分析工具、报表设计工具、科学计算工具等等,
    若你确实遇到“一种特定类型的问题发生的频率足够高”的情况,准备使用解释器模式时,可以考虑一下Expression4J、MESP(Math Expression String Parser)、Jep等开源的解析工具包(这三个开源产品都可以百度、Google中搜索到,请读者自行查询),
    功能都异常强大,而且非常容易使用,效率也还不错,实现大多数的数学运算完全没有问题,自己没有必要从头开始编写解释器
  • 相关阅读:
    good course Very
    HTTP Hypertext Transfer Protocol Overview
    Linux下tar.xz结尾的文件的解压方法
    原来java HttpURLConnection本身就提供了chunk的支持,又是让人一惊啊
    牛人一枚
    V2EX › 花了3个晚上,把readability最新的1.7.1转成了python版的
    13.11. 惯例优先原则(convention over configuration)
    明尼苏达大学
    快速构建实时抓取集群 « 搜索技术博客-淘宝
    Java Practices > Home
  • 原文地址:https://www.cnblogs.com/LQBlog/p/12742688.html
Copyright © 2011-2022 走看看