Java 设计模式系列(17) —— 解释器模式

2021-01-29 10:41:54 浏览数 (1)

解释器模式

解释器模式是一种按照规定语法进行解析的方案。

解释器模式的定义: 给定一门语言,定义它的文法的一种表示并定义一个解释器,该解释器用来表示解释语言中的句子。

解释器模式的参与者:

  • Abstract Expression 抽象解释器角色:该角色声明一个所有具体表达式角色所需要的的接口
  • TerminalExpression 终结符表达式:该角色实现了抽象表达式所需要的接口
  • Nonterminal 非终结符表达式:该角色是一个具体角色,
  • Context 环境角色:Context 角色提供一些解释器之外的全局信息
解释器模式的简单示例

抽象解释器模式

代码语言:javascript复制
public interface IArithmeticInterpreter {
	public int interpreter();

}

终结符表达式

代码语言:javascript复制
public class NumInterpreter implements IArithmeticInterpreter {
	private int num;
	
	public NumInterpreter(int _num) {
		this.num = _num;
	}

	@Override
	public int interpreter() {
		return num;
	}

}

非终结符表达式角色

  1. 非终结符表达角色的抽象对象
代码语言:javascript复制
public abstract class Interpreter implements IArithmeticInterpreter{
	protected IArithmeticInterpreter left;
	protected IArithmeticInterpreter right;
	
	public Interpreter(IArithmeticInterpreter _left,IArithmeticInterpreter _right) {
		this.left = _left;
		this.right = _right;
	}
	
}
  1. ADD
代码语言:javascript复制
public class AddInterperter extends Interpreter {

	public AddInterperter(IArithmeticInterpreter _left, IArithmeticInterpreter _right) {
		super(_left, _right);
	}

	@Override
	public int interpreter() {
		return this.left.interpreter()   this.right.interpreter();
	}

}
  1. SUB
代码语言:javascript复制
public class SubInterpreter extends Interpreter{

	public SubInterpreter(IArithmeticInterpreter _left, IArithmeticInterpreter _right) {
		super(_left, _right);
	}

	@Override
	public int interpreter() {
		return this.left.interpreter() - this.right.interpreter();
	}

}
  1. Multiply
代码语言:javascript复制
public class MultiInterpreter extends Interpreter {

	public MultiInterpreter(IArithmeticInterpreter _left, IArithmeticInterpreter _right) {
		super(_left, _right);
	}

	@Override
	public int interpreter() {
		return this.left.interpreter() * this.right.interpreter();
	}

}
  1. Divide
代码语言:javascript复制
public class DivInterpreter extends Interpreter {

	public DivInterpreter(IArithmeticInterpreter _left, IArithmeticInterpreter _right) {
		super(_left, _right);
		// TODO Auto-generated constructor stub
	}

	@Override
	public int interpreter() {
		return this.left.interpreter() / this.right.interpreter();
	}

}

Context 角色

代码语言:javascript复制
public class GPCalculator {
	private Stack<IArithmeticInterpreter> s = new Stack<IArithmeticInterpreter>();
	
	public GPCalculator(String expression) {
		this.prase(expression);
	}

	private void prase(String expression) {
		String [] elements = expression.split(" ");
		IArithmeticInterpreter left,right;
		
		for(int i=0;i< elements.length;i  ) {
			String operator = elements[i];
			if(OperatorUtil.isOperator(operator)) {
				left = this.s.pop();
				right = new NumInterpreter(Integer.valueOf(elements[  i]));
				System.out.println("出栈"   left.interpreter()   "和"   right.interpreter());
				this.s.push(OperatorUtil.getInterpreter(left, right, operator));
				System.out.println("应用运算符");
			}else {
				NumInterpreter numInterpreter = new NumInterpreter(Integer.parseInt(operator));
				this.s.push(numInterpreter);
				System.out.println("入栈"   numInterpreter.interpreter());
			}
		}
		
	}

}
解释器模式的优缺点

解释器模式的优点

  • 简单的语法分析工具
  • 优秀的扩展性

解释器模式的缺点

  • 解释器模式会引起类膨胀
  • 解释器模式采用递归调用的方法
  • 解释器模式会采用大量递归和循环,效率低下

解释器模式的使用场景

  • 重复发生的问题可以使用解释器模式
  • 一个简单的语法需要解释的场景

0 人点赞