设计模式:解释器模式

 

基本结构:

1、抽象表达式:接口,用于定义解释所需的方法。

2、终结符表达式:实现1接口,该类是以一一对应的关系,解释语句。每个表达式将由一个该类对其进行解释与存储。

3、非终结符表达式:实现1接口,该类负责解释语句,将语句委托给一个或多个2(终结符表达式)进行解释。

4、上下文:即被解释的语句。

 

 

对一个包含主谓宾的英文语句解释为汉语。

1、抽象表达式:

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午9:36:09 
* @version 1.0 
*/
public interface Node {
	public void parse(Context context);
	public void execute();
}


2、终结符表达式:

 

主语:

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午9:37:23 
* @version 1.0 
*/
public class Z implements Node {

	String [] word = {"you" , "He"};
	String token;
	boolean boo;
	
	@Override
	public void parse(Context context) {
		token = context.nextToken();
		int i = 0;
		for(i=0;i<word.length;i++){
			if(token.equalsIgnoreCase(word[i])){
				boo = true;
				break;
			}
		}
		if(i == word.length){
			boo = false;
		}
	}

	@Override
	public void execute() {
		if(boo){
			if(token.equalsIgnoreCase(word[0]))
				System.out.println("你");
			if(token.equalsIgnoreCase(word[1]))
				System.out.println("他");
		}else{
			System.out.println(token + "(不是该语言中的语句)");
		}
	}

}


谓语:

 

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午9:47:40 
* @version 1.0 
*/
public class W implements Node {
	
	String [] word = {"Drink" , "Eat"};
	String token;
	boolean boo;

	@Override
	public void parse(Context context) {
		token = context.nextToken();
		int i = 0;
		for(i = 0;i<word.length;i++){
			if(token.equalsIgnoreCase(word[i])){
				boo = true;
				break;
			}
		}
		if(i == word.length)
			boo = false;
	}

	@Override
	public void execute() {
		if(boo){
			if(token.equalsIgnoreCase(word[0]))
				System.out.println("喝");
			if(token.equalsIgnoreCase(word[1]))
				System.out.println("吃");
		}else{
			System.out.println(token + "(不是该语言中的语句)");
		}
	}

}


宾语:

 

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午9:54:32 
* @version 1.0 
*/
public class B implements Node {
	String [] word = {"water" ,"milk","bread"};
	String token;
	boolean boo;

	@Override
	public void parse(Context context) {
		token = context.nextToken();
		int i = 0 ;
		for(i=0;i<word.length;i++){
			if(token.equalsIgnoreCase(word[i])){
				boo = true;
				break;
			}
		}
		if(i == word.length)
			boo = false;
	}

	@Override
	public void execute() {
		if(boo){
			if(token.equalsIgnoreCase(word[0]))
				System.out.println("水");
			if(token.equalsIgnoreCase(word[1]))
				System.out.println("牛奶");
			if(token.equalsIgnoreCase(word[2]))
				System.out.println("面包");
		}
		else{
			System.out.println(token + "不是该语言中的语句");
		}
	}
	
	
}

 

 

3、非终结表达式:

关注主语:

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午10:18:53 
* @version 1.0 
*/
public class ZNode implements Node {

	Node node;
	@Override
	public void parse(Context context) {
		node = new Z();
		node.parse(context);
	}

	@Override
	public void execute() {
		node.execute();
	}

}


关注谓语:

 

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午10:22:22 
* @version 1.0 
*/
public class WNode implements Node {
	Node node;

	@Override
	public void parse(Context context) {
		node = new W();
		node.parse(context);
	}

	@Override
	public void execute() {
		node.execute();
	}

}


关于宾语:

 

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午10:23:37 
* @version 1.0 
*/
public class BNode implements Node {
	Node node;

	@Override
	public void parse(Context context) {
		node = new B();
		node.parse(context);
	}

	@Override
	public void execute() {
		node.execute();
	}

}


关注整句的解析:

 

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午10:25:30 
* @version 1.0 
*/
public class SentenceNode implements Node {
	Node z,w,b;

	@Override
	public void parse(Context context) {
		z = new ZNode();
		w = new WNode();
		b = new BNode();
		z.parse(context);
		w.parse(context);
		b.parse(context);

	}

	@Override
	public void execute() {
		z.execute();
		w.execute();
		b.execute();
	}

}


4、上下文:

 

 

package interpreter;

import java.util.StringTokenizer;

/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午9:28:33 
* @version 1.0 
*/
public class Context {
	StringTokenizer tokenizer;
	String token;
	/**
	 * @param token
	 */
	public Context(String token) {
		super();
		setContext(token);
	}
	
	public void setContext(String token){
		tokenizer = new StringTokenizer(token);
	}
	
	String nextToken(){
		if(tokenizer.hasMoreTokens()){
			token = tokenizer.nextToken();
		}else{
			token = "";
		}
		return token;
	}
	
	

}


last、主函数:

 

 

package interpreter;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月6日 上午10:28:54 
* @version 1.0 
*/
public class M {

	public static void main(String[] args) {
		
		String s = "he eat bread";
		Context context = new Context(s);
		Node node = new SentenceNode();
		node.parse(context);
		node.execute();

	}

}


结果输出:

 

 

他
吃
面包

 

 

 

优点:

1、将每个语法规则标识成一个类,方便于实现简单的语言。

2、由于使用类标识语法规则,可以较容易改变或拓展语言的行为。

3、通过在类结构中加入新的方法,可以这解释的同时增加新的行为。

 

 

 

 

 

 

使用情景:

 

当有一个简单的语言需要解释执行,并且可以将该语言的每一个规则表示为一个类时,可以使用解释器模式。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值