二十三、解释器模式 interpreter

时间:2022-05-07 20:42:12

一、定义

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如果一个特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个示例标书为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。

二、结构图

二十三、解释器模式 interpreter

三、代码示例

/**
 * @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);
	}
}