解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。


该模式涉及角色如下:

1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。

2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。

4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。


1、实体类Context,具体代码如下:

package com.yoodb;

public class Context {
	private Integer numo;
	
	private Integer numt;
	

	public Context(Integer numo, Integer numt) {
		this.numo = numo;
		this.numt = numt;
	}

	public Integer getNumo() {
		return numo;
	}

	public void setNumo(Integer numo) {
		this.numo = numo;
	}

	public Integer getNumt() {
		return numt;
	}

	public void setNumt(Integer numt) {
		this.numt = numt;
	}
	
}


2、一个接口,具体代码如下:

package com.yoodb;

public interface Expression {
	public int interpret(Context context);
}


3、两个接口实现类,一个类是参数相加,一个类是参数相减,具体代码如下:

package com.yoodb;

public class Minus implements Expression {

	@Override
	public int interpret(Context context) {
		// TODO Auto-generated method stub
		 return context.getNumo()-context.getNumt();  
	}

}

package com.yoodb;


public class Plus implements Expression {

	@Override
	public int interpret(Context context) {
		// TODO Auto-generated method stub
		return context.getNumo() + context.getNumt();  
	}

}


4、单元测试,具体代码如下:

package com.yoodb;

public class MainTest {
	public static void main(String[] args) {
		int result = new Minus().interpret((new Context(new Plus().interpret(new Context(2015, 8)), 4))); 
		System.out.println(result);
	}
}

运行结果如下:

2019


优点:解释器模式提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。而且在解释器中不同的规则是由不同的类来实现的,这样使得添加一个新的语法规则变得简单。

评论

分享:

支付宝

微信