2023-06-15
原文作者: 求和的小熊猫 原文地址:https://blog.csdn.net/qq_38219153/article/details/110894623

解释器模式

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

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

解释器模式的参与者:

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

抽象解释器模式

    public interface IArithmeticInterpreter {
    	public int interpreter();
    
    }

终结符表达式

    public class NumInterpreter implements IArithmeticInterpreter {
    	private int num;
    	
    	public NumInterpreter(int _num) {
    		this.num = _num;
    	}
    
    	@Override
    	public int interpreter() {
    		return num;
    	}
    
    }

非终结符表达式角色

  1. 非终结符表达角色的抽象对象
    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
    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
    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
    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
    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 角色

    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());
    			}
    		}
    		
    	}
    
    }
解释器模式的优缺点

解释器模式的优点

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

解释器模式的缺点

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

解释器模式的使用场景

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