一、定义
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如果一个特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个示例标书为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。
如果一个特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个示例标书为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。
二、结构图
三、代码示例
/** * @use 以音乐播放器代码测试解释器模式 * @author lattice * @date 2017-01-10 */ public class Interpreter { public static void main(String[] args) { PlayContext context=new PlayContext(); context.playText="0 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5" + " A 0.5 0 3 C 1 0 2 A 0.5 G 1 C 0.5 E 0.5 D 3 "; Expression expression=null; try { while(context.playText.length()>0){ String str=context.playText.substring(0, 1); switch(str){ case "0": expression=new Scale(); break; case "C": case "D": case "E": case "F": case "G": case "A": case "B": case "P": expression=new Note(); break; } expression.interpret(context); } } catch (Exception e) { System.out.println(e.getMessage()); } /** * 输出结果 * 中音356352356高音1中音65132 */ } } /** * 播放内容类 * @author lattice * */ class PlayContext{ private String text; public String playText; public String getText() { return text; } public void setText(String text) { this.text = text; } } /** * 表达式类 * @author lattice * */ abstract class Expression{ //解释器 public void interpret(PlayContext context){ if(context.playText.length()==0){ return; }else{ String playKey=context.playText.substring(0, 1); context.playText=context.playText.substring(2); double playValue=Double.parseDouble(context.playText.substring(0, context.playText.indexOf(" "))); context.playText=context.playText.substring(context.playText.indexOf(" ")+1); excute(playKey, playValue); } } public abstract void excute(String key,double value); } /** * 音符类 * @author lattice * */ class Note extends Expression{ @Override public void excute(String key, double value) { String note=""; switch(key){ case "C": note="1"; break; case "D": note="2"; break; case "E": note="3"; break; case "F": note="4"; break; case "G": note="5"; break; case "A": note="6"; break; case "B": note="7"; break; } System.out.print(note); } } /** * 音符类 * @author lattice * */ class Scale extends Expression{ @Override public void excute(String key, double value) { String scale=""; int intValue=(int)value; switch(intValue){ case 1: scale="低音"; break; case 2: scale="中音"; break; case 3: scale="高音"; break; } System.out.print(scale); } }