当前位置: 首页 > 后端技术 > Java

设计模式-解释器模式

时间:2023-04-02 10:29:15 Java

解释器模式1.定义和类型定义:给定一种语言,定义其语法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子语言创建的解释器的类型:Behavioral2.出现频率适用场景中特定类型的问题足够高3.优点语法由很多类表示,易于更改和扩展语言4.缺点当语法规则数量过多时,增加了系统的复杂性5.相关设计模式解释器模式和适配器模式6.编码创建解释器顶层接口publicinterfaceInterpreter{intinterpreter();}解释器相关实现类publicclassAddInterpreterimplementsInterpreter{privateInterpreterfirstExpression,secondExpression;publicAddInterpreter(InterpreterfirstExpression,InterpretersecondExpression){this.firstExpression=firstExpression;this.secondExpression=secondExpression;}@Overridepublicintinterpreter(){returnthis.firstExpression.interpreter()+this.secondExpression.interpreter();}@OverridepublicStringtoString(){返回“+”;}}publicclassMultiInterpreterimplementsInterpreter{privateInterpreterfirstExpression,secondExpression;publicMultiInterpreter(InterpreterfirstExpression,InterpretersecondExpression){this.firstExpression=firstExpression;this.secondExpression=secondExpression;}@Overridepublicintinterpreter(){returnthis.firstExpression.interpreter()*this.secondExpression.interpreter();}@OverridepublicStringtoString(){返回“*”;}}创建数字解析器,用于处理入口publicclassNumberInterpreterimplementsInterpreter{privateintnumber;publicNumberInterpreter(intnumber){this.number=number;}publicNumberInterpreter(Stringnumber){this.number=Integer.parseInt(number);}@Overridepublicintinterpreter(){returnthis.number;}}简单实现了一个工具类publicclassOperatorUtil{publicstaticbooleanisOperator(Stringsymbol){return(symbol.equals("+")||symbol.equals("*"));}publicstaticInterpretergetExpressionObjects(InterpreterfirstInterpreter,InterpretersecondInterpreter,Stringsymbol){if("+".equals(symbol)){returnnewAddInterpreter(firstInterpreter,secondInterpreter);}elseif("*".equals(symbol)){returnnewMultiInterpreter(firstInterpreter,secondInterpreter);}返回空值;}}自定义一个解释器语言法publicclassQchExpressionParser{privateStackstack=newStack<>();publicintparse(Stringstr){String[]strArray=str.split("");for(Stringitem:strArray){if(!OperatorUtil.isOperator(item)){NumberInterpreternumberInterpreter=newNumberInterpreter(item);stack.push(numberInterpreter);System.out.println(String.format("入栈:%d",numberInterpreter.interpreter()));}else{解释器firstInterpreter=stack.pop();解释器secondInterpreter=stack.pop();System.out.println(String.format("出栈:%d和%d",firstInterpreter.interpreter(),secondInterpreter.inter预处理())??);解释器expressionObjects=OperatorUtil.getExpressionObjects(firstInterpreter,secondInterpreter,item);System.out.println(String.format("应用运算符:%s",expressionObjects.interpreter()));intresult=expressionObjects.interpreter();NumberInterpreternumberInterpreter=newNumberInterpreter(result);stack.push(numberInterpreter);System.out.println(String.format("阶段结果推送:%d",result));}}intresult=stack.pop().interpreter();返回结果;}}测试测试类公共类测试{publicstaticvoidmain(String[]args){StringgeelyInputStr="610011+*";QchExpressionParserexpressionParser=newQchExpressionParser();intparse=expressionParser.parse(geelyInputStr);System.out.println("解释器执行结果为:"+parse);}}控制台打印7.源码中使用Spring框架publicclassTestForSpring{publicstaticvoidmain(String[]args){ExpressionParser解析器=newSpelExpressionParser();表达式expression=parser.parseExpression("100+11*6");int结果=(int)expression.getValue();System.out.println(结果);}}debug看源码这个方法在最后处理我们的表达式

最新推荐
猜你喜欢