解释器模式
一、定义
给定一种语言,定义它的语法的一种表示和一个解释器,该解释器使用该表示来解释语言中的句子。
二、类图表示

三、实现
例子程序是将罗马数字转换为阿拉伯数字。
1、Context
package pattern.behavioral.interpreter;
public class Context {
	private String input;
	private int output;
	
	public Context(String input) {
		this.input = input;
	}
	public String getInput() {
		return input;
	}
	public void setInput(String input) {
		this.input = input;
	}
	public int getOutput() {
		return output;
	}
	public void setOutput(int output) {
		this.output = output;
	}
}
2、AbstractExpression
package pattern.behavioral.interpreter;
public abstract class Expression {
	public void interpret(Context context){
		String input = context.getInput();
		if(input == null || "".equals(input.trim())){
			return;
		}
		int result = context.getOutput();
		String nine = nine();
		String four = four();
		String five = five();
		String one = one();
		int multiplier = multiplier();
		//IV、VI等先判断
		if(input.startsWith(nine)){
			result += 9 * multiplier;
			input = input.substring(nine.length());//substring(2)
		}else if(input.startsWith(four)){
			result += 4 * multiplier;
			input = input.substring(four.length());//substring(2)
		}else if(input.startsWith(five)){
			result += 5 * multiplier;
			input = input.substring(five.length());//substring(1)
		}
		//I、X、C可能会出现3次
		while(input.startsWith(one)){
			result += multiplier;
			input = input.substring(one.length());//substring(1)
		}
		context.setInput(input);
		context.setOutput(result);
	}
	
	public abstract String one();
	public abstract String four();
	public abstract String five();
	public abstract String nine();
	public abstract int multiplier();
}
3、ConcreteExpression
//个位数解析
package pattern.behavioral.interpreter;
public class OneExpression extends Expression {
	@Override
	public String one() {
		return "I";
	}
	@Override
	public String four() {
		return "IV";
	}
	@Override
	public String five() {
		return "V";
	}
	@Override
	public String nine() {
		return "IX";
	}
	@Override
	public int multiplier() {
		return 1;
	}
}
//十位数解析
package pattern.behavioral.interpreter;
public class TenExpression extends Expression {
	@Override
	public String one() {
		return "X";
	}
	@Override
	public String four() {
		return "XL";
	}
	@Override
	public String five() {
		return "L";
	}
	@Override
	public String nine() {
		return "XC";
	}
	@Override
	public int multiplier() {
		return 10;
	}
}
//百位数解析
package pattern.behavioral.interpreter;
public class HundredExpression extends Expression {
	@Override
	public String one() {
		return "C";
	}
	@Override
	public String four() {
		return "CD";
	}
	@Override
	public String five() {
		return "D";
	}
	@Override
	public String nine() {
		return "CM";
	}
	@Override
	public int multiplier() {
		return 100;
	}
}
//千位数解析
package pattern.behavioral.interpreter;
public class ThousandExpression extends Expression {
	@Override
	public String one() {
		return "M";
	}
	@Override
	public String four() {
		return " ";
	}
	@Override
	public String five() {
		return " ";
	}
	@Override
	public String nine() {
		return " ";
	}
	@Override
	public int multiplier() {
		return 1000;
	}
}
四、使用
package pattern.behavioral.interpreter;
import java.util.ArrayList;
import java.util.List;
public class Client {
	public static void main(String[] args) {
		String romanNumber = "MMMCDLXXVIII";
		Context context = new Context(romanNumber);
		
		List<Expression> parsers = new ArrayList<>();
		parsers.add(new ThousandExpression());
		parsers.add(new HundredExpression());
		parsers.add(new TenExpression());
		parsers.add(new OneExpression());
		
		for(Expression parser : parsers){
			parser.interpret(context);
		}
		
		System.out.println(String.format("%s = %s", romanNumber, context.getOutput()));
	}
}
- 程序输出:
MMMCDLXXVIII = 3478
五、适用场合
- 当有一个语言需要解释执行,并且可以将该语言中的句子表示为一个抽象的语法树时