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中搜索到,请读者自行查询),
    功能都异常强大,而且非常容易使用,效率也还不错,实现大多数的数学运算完全没有问题,自己没有必要从头开始编写解释器
  • 相关阅读:
    奇数阶魔方问题
    《DSP using MATLAB》示例9.3
    《DSP using MATLAB》示例9.2
    《DSP using MATLAB》示例9.1
    找个目标很重要
    《DSP using MATLAB》示例Example 8.30
    《DSP using MATLAB》示例Example 8.29
    《DSP using MATLAB》示例Example 8.28
    《DSP using MATLAB》示例Example 8.27
    《DSP using MATLAB》示例Example 8.26
  • 原文地址:https://www.cnblogs.com/LQBlog/p/12742688.html
Copyright © 2011-2022 走看看