解释器模式:给定一种语言,定义它的文法表示,并定义一个解释器,这个解释器用来解释语言中的句子
优点:当一个语言需要执行,并且你可将该语言中的句子表示为抽象语法树时,可使用解释器模式
实现:做一个音乐解释器,O代表音阶,ABCDEFG代表音符
1、演奏内容类
/*** 演奏内容类*/public class PlayContext {private String text;public String getText() {return text;}public void setText(String text) {this.text = text;}}
2、表达式类
/*** 抽象表达式类*/public abstract class Expression {/*** 解释器*/public void interpret(PlayContext context){if (context.getText() == null || context.getText().length() == 0){return;}else{String palyKey = context.getText().substring(0 , 1);context.setText(context.getText().substring(2));Double palyValue = Double.valueOf(context.getText().substring(0 , context.getText().indexOf(" ")));context.setText(context.getText().substring(context.getText().indexOf(" ") + 1));excute(palyKey , palyValue);}}/*** 执行*/public abstract void excute(String key , Double value);}/*** 音符类*/public class NoteExpression extends Expression{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(MessageFormat.format("{0} ", note));}}/*** 音节类*/public class ScaleExpression extends Expression{public void excute(String key , Double value){String scale = "";switch (value.intValue()){case 1:scale = "低音";break;case 2:scale = "中音";break;case 3:scale = "高音";break;}System.out.print(MessageFormat.format("{0} ", scale));}}
3、测试类
/*** 测试解释器模式*/public class TestExpression {public static void main(String [] args){PlayContext context = new PlayContext();context.setText("O 2 E 0.5 G 0.5 A 3 O 1 B 2 ");Expression expression = null;while (context.getText().length() > 0){String str = context.getText().substring(0 , 1);switch (str){case "O":expression = new ScaleExpression();break;case "C":case "D":case "E":case "F":case "G":case "A":case "B":case "P":expression = new NoteExpression();break;}expression.interpret(context);}}}
测试结果:
如果一个特定类型问题的发生频率足够高,那么就值得将该问题的各个实例表述为一个简单的语言中的句子,这样就可以构建一个解释器,通过解释器解释这些句子来解决问题
