解释器模式:给定一种语言,定义它的文法表示,并定义一个解释器,这个解释器用来解释语言中的句子
优点:当一个语言需要执行,并且你可将该语言中的句子表示为抽象语法树时,可使用解释器模式
实现:做一个音乐解释器,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);
}
}
}
测试结果:
如果一个特定类型问题的发生频率足够高,那么就值得将该问题的各个实例表述为一个简单的语言中的句子,这样就可以构建一个解释器,通过解释器解释这些句子来解决问题