java设计模式之解释器模式

时间:2021-11-24 17:11:27

    解释器模式(InterpreterPattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。简单地说,Interpreter模式是一种简单的语法解释器构架。

解决问题:对于一些固定文法构建一个解释句子的解释器。

解决方式:

    构件语法树,定义终结符与非终结符。构件环境类,包含解释器之外的一些全局信息,一般是HashMap。 

使用场景:

    1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。

    2、一些重复出现的问题可以用一种简单的语言来进行表达。

    3、一个简单语法需要解释的场景。

应用实例:编译器、运算表达式计算。

解释器模式UML图:

java设计模式之解释器模式

角色和职责:

    Context:解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。

    AbstractExpression :解释器抽象类。

    ConcreteExpression:解释器具体实现类。

代码示例:

/**
 * @author arain.liu
 *上下文环境类,用来保存文法
 */
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;
	}
}
/**
 * 抽象解释器
 * @author arain.liu
 */
public abstract class Expression {
	public abstract void interpret(Context context);
}
/**
 * 减法解释器
 * @author arain.liu
 *
 */
public class MinusExpression extends Expression {

	@Override
	public void interpret(Context context) {
		System.out.println("自动递减");
		String input = context.getInput();
		int intInput = Integer.valueOf(input);
		--intInput;
		context.setInput(String.valueOf(intInput));
		context.setOutput(intInput);
	}

}
/**
 * 加法解释器
 * @author arain.liu
 */
public class PlusExpression extends Expression {

	@Override
	public void interpret(Context context) {
		System.out.println("自动递增");;
		//获得上下文环境
		String input = context.getInput();
		//进行类型转换
		int intInput = Integer.valueOf(input);
		//进行递增
		++intInput;
		//对上下文环境重新进行赋值
		context.setInput(String.valueOf(intInput));
		context.setOutput(intInput);
	}

}

public class MainClass {

	public static void main(String[] args) {
		String name = "20";
		Context context = new Context(name);
		
		List<Expression> list = new ArrayList<Expression>();
		list.add(new PlusExpression());
		list.add(new PlusExpression());
		list.add(new MinusExpression());
		list.add(new MinusExpression());
		list.add(new MinusExpression());
		list.add(new MinusExpression());
		
		for(Expression ex : list){
			ex.interpret(context);
			System.out.println(context.getOutput());
		}
	}
}
优缺点:

优点:

    1、可扩展性比较好,灵活。

    2、增加了新的解释表达式的方式。

    3、易于实现简单文法。

缺点:

    1、可利用场景比较少。

    2、对于复杂的文法比较难维护。

    3、解释器模式会引起类膨胀。

    4、解释器模式采用递归调用方法。