• 解释器模式


    基本上就是必须把元素和句子,都要是为符号。所以需要一个他们的抽象类。就可以出来解释器模式了。为什么元素和句子要一个通用意图?因为解释器的句子,可能就是某个句子的符号。 整个代码就是树结构。任何一个点都是一个树。
    个人感觉,基本不会自己独立去实现这个模式,java,c#都是一种更高级语言,如果非要开启解释模式,那么肯定可以找到某一领域的库,或者干脆换个专用的语言就好了。.
    //感觉解释器模式的难点在于设计解释器和匹配规则上,而不在于解释器模式。
    //所以想了一个死板的规则,测试某个字符串是否是 0~9数字的四则运算,比较好操作
    //文法: <expression> ::= <num><operate><num>
    //<num> ::= [0~9]
    //<operate> ::= +-*/
    //v1.在做解释器文法这种模式之前,还是做一个更直观的非文法的版本,来看看到底区别在哪里。
    //很明显,第一版的问题,在于规则 if(isNum(obj1)&&isOperate(obj2)&&isNum(obj3)) hardcode在判断逻辑中,不符合开闭原则
    //v2.第二版,已经符合开闭原则,但是看了下解释器模式,还是根本上不是一个东西。解释器的目的不是符合开闭原则,开闭原则只是它的必须要满足的条件。
    //解释器的模式是固定的,用来解释一整套语法规则。 终结符和非终结符都视为一个可判断的符号。所以 必须增加一个终结符和非终结符通用的抽象类。
    //这样。抽象符号类,终结符号类,非终结符号类。 context(我们会设立的一个处理类).就构成了典型的解释器模式。
    //个人感觉,基本不会自己独立去实现这个模式,java,c#都是一种更高级语言,如果非要开启解释模式,那么肯定可以找到某一领域的库,或者干脆换个专用的语言就好了。
    //而简单的解释,用if else .类,方法。就可以。不需要一个解释器模式.
    public class Interpreter
    {
        public void Run()
        {
            String expression1="2+9";
            String expression2="2=9";
            String expression3="a-2";
    
            CheckExpression checkExpression=new CheckExpression();
            boolean res1= checkExpression.check(expression1);
            boolean res2= checkExpression.check(expression2);
            boolean res3= checkExpression.check(expression3);
    
            LSComponentsHelper.LS_Log.Log_INFO(res1+"."+res2+"."+res3+".");
        }
    
        public void Run2()
        {
            String expression1="2+9";
            String expression2="2=9";
            String expression3="a-2";
    
            CheckExpression2 checkExpression=new CheckExpression2();
            boolean res1= checkExpression.check(expression1);
            boolean res2= checkExpression.check(expression2);
            boolean res3= checkExpression.check(expression3);
    
            LSComponentsHelper.LS_Log.Log_INFO(res1+"."+res2+"."+res3+".");
        }
    
        public boolean isNum(String obj)
        {
            boolean res=false;
            try
            {
                Integer.parseInt(obj);
                res=true;
            } catch (NumberFormatException e)
            {
                e.printStackTrace();
            }
            return res;
        }
    
        public boolean isOperate(String objstr)
        {
            boolean res=false;
            if(objstr.equals("+")||objstr.equals("-")||objstr.equals("*")||objstr.equals("/"))
            {
                res=true;
            }
            return res;
        }
    
        //region non-interreter ,regular is with in the check logic. we need kick it out .
        public class CheckExpression
        {
            public boolean check(String expression)
            {
                boolean res=false;
                //num ope num
                String obj1=expression.substring(0,1);
                String obj2=expression.substring(1,2);
                String obj3=expression.substring(2,3);
                if(isNum(obj1)&&isOperate(obj2)&&isNum(obj3))
                {
                    res=true;
                }
                return res;
            }
        }
        //endregion
    
        //region 符合开闭原则,并把元素的判断和整个表达式的判断,都抽象为一个符号,也就是终结符号和非终结符号,也就是可判断正确与否的符号。
        //concext class ,很多时候都喜欢叫做context ,对于中文来说,可能会理解为一个处理类。
        public class CheckExpression2
        {
            public IRegulation mIRegulation=new SimpleCaculateRegulation();
            public boolean check(String expression)
            {
                boolean res=false;
                if(mIRegulation.Check(expression))
                {
                    res=true;
                }
                return res;
            }
        }
    
        //Expression 抽象表达式
        public interface IRegulation
        {
            public Boolean Check(String expression);
        }
    
        //非终结符表达式。也就是句子。不是某个不可拆分的符号。
        public class SimpleCaculateRegulation implements IRegulation
        {
            @Override
            public Boolean Check(String expression)
            {
                boolean res=false;
                String obj1=expression.substring(0,1);
                String obj2=expression.substring(1,2);
                String obj3=expression.substring(2,3);
    
                NumRegulation numRegulation=new NumRegulation();
                OperateRegulation operateRegulation=new OperateRegulation();
    
                if(numRegulation.Check(obj1)&&operateRegulation.Check(obj2)&&numRegulation.Check(obj3))
                {
                    res=true;
                }
                return res;
            }
        }
    
        //终结符表达式,数字
        public class NumRegulation implements IRegulation
        {
            public Boolean Check(String obj)
            {
                boolean res = false;
                try
                {
                    Integer.parseInt(obj);
                    res = true;
                } catch (NumberFormatException e)
                {
                    e.printStackTrace();
                }
                return res;
            }
        }
    
        //终结符表达式,符号
        public class OperateRegulation implements  IRegulation
        {
            public Boolean Check(String objstr)
            {
                boolean res = false;
                if (objstr.equals("+") || objstr.equals("-") || objstr.equals("*") || objstr.equals("/"))
                {
                    res = true;
                }
                return res;
            }
        }
    
    
        //endregion
    
    }
  • 相关阅读:
    iOS构建流畅的交互界面--卡顿产生的原因
    iOS-tableViewCell重用机制带来的问题及解决
    完全背包
    poj1384
    RunLoop的使用--AFNetworking的网络线程实现+tableView延迟加载图片+App崩溃后立即重启
    poj 3624
    01背包
    poj1416
    java中 File文件常用操作方法的汇总
    线程中涉及到的知识点总结
  • 原文地址:https://www.cnblogs.com/lsfv/p/11149109.html
Copyright © 2020-2023  润新知