解释器模式
解释器模式是最后一个模式了,而且接触到的名词也多,所以会把定义、UML和结构一起列完之后,统一说明理解。
解释器模式(Interpreter):给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
UML
解释模式构成
抽象表达式(AbstractExpression):声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
终结符表达式(TerminalExpression):实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
非终结符表达式(NonterminalExpression):为文法中的非终结符相关的解释操作。
环境类(Context):包含解释器之外的一些全局信息。
这里需要解释的有
文法:文章的书写法规,就是跟法律差不多的东西,法律约束人的行为,文法约束书写的规矩。
解释器:简单的可以理解为翻译器,按照特定文法来翻译。
抽象语法树:是语法树状结构的表达,比如3+1-2
终结符:终结符就是最基本的元素不能再分解,上图树状图中的数字也就是叶子都是终结符。
非终结符:非终结符就刚好相反了,对应树状图的符号也就是树枝。
就拿3+1-2的例子来说吧!这个是人类定义的语法计算肯定不能识别,所以要经过解码器翻译。
代码表示
interface Node{
int interpreter();
}
class Value implements Node{
private int value;
public Value(int value){
this.value=value;
}
@Override
public int interpreter() {
return value;
}
}
class Add implements Node{
private int left;
private int right;
public Add(int left,int right){
this.left=left;
this.right=right;
}
@Override
public int interpreter() {
return left+right;
}
}
class Sub implements Node{
private int left;
private int right;
public Sub(int left,int right){
this.left=left;
this.right=right;
}
@Override
public int interpreter() {
return left-right;
}
}
class Context{
private String statement;
private Node num;
private int score=0;
public void setStatement(String statement) {
this.statement = statement;
}
public int compute(){
String[] str=statement.split("");
score=Integer.valueOf(str[0]);
for(int i=1;i<str.length;i++){
if(i%2!=0){
num=new Value(Integer.valueOf(str[(i+1)]));
if("+".equals(str[i])){
score+=num.interpreter();
}else{
score-=num.interpreter();
}
}
}
return score;
}
}
public class Client {
public static void main(String[] args) {
String statement="3+1-2";
Context context=new Context();
context.setStatement(statement);
int scroe=context.compute();
System.out.println(scroe);
}
}