【小话设计模式】行为型之解释器模式

1.概念

     给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。


2.适应场景

    通常用在对公式或者数据的解析,从而输出符合要求的数据等。

2.1优点

    解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了

2.2缺点

    解释器模式会引起类的膨胀,每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。

3.应用举例

    将大写的数字翻译成标准的数值。
    如:九千九百九十九万九千九百零九——99999909
   
/**
 * 
 * 项目名称:设计模式 
 * 类名称:Context   
 * 类描述:上下文类   
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-4 下午05:02:47    
 * @version 1.0   
 *
 */
public class Context {
	String input ="";
	int outPut;
	public Context(String str){
		if(str!=null)
			this.input = str;
	}
	public String getInput() {
		return input;
	}
	public void setInput(String input) {
		this.input = input;
	}
	public int getOutPut() {
		return outPut;
	}
	public void setOutPut(int outPut) {
		this.outPut = outPut;
	}
}
import java.util.HashMap;
import java.util.Map;
/**
 * 
 * 项目名称:设计模式   
 * 类名称:Expression   
 * 类描述:大写解释器抽象类
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-4 下午05:02:16    
 * @version 1.0   
 *
 */
public abstract class Expression {
	Map<String, Integer> map = new HashMap<String, Integer>();

	public Expression() {
		map.put("一", 1);
		map.put("二", 2);
		map.put("三", 3);
		map.put("四", 4);
		map.put("五", 5);
		map.put("六", 6);
		map.put("七", 7);
		map.put("八", 8);
		map.put("九", 9);
	}

	public void Interpret(Context context) {

		if (context.getInput().length() == 0) {
			return;
		}
		for (String key : map.keySet()) {
			if (context.getInput().endsWith(key + this.getPostfix())) {
				int out = context.getOutPut();
				out += map.get(key) * this.mulitiplier();
				context.setOutPut(out);
				context.setInput(context.getInput().substring(0, context.getInput().length() - 1 - this.getPostfix().length()));
			} else if (context.getInput().endsWith("零")) {
				context.setInput(context.getInput().substring(0, context.getInput().length() - 1));
			}
		}
	}

	public abstract Integer mulitiplier();

	public abstract String getPostfix();
}

/**
 * 
 * 项目名称:设计模式	
 * 类名称:GeExpression   
 * 类描述:  个位解释器
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-9 上午10:28:06    
 * @version 1.0   
 *
 */
public class GeExpression extends Expression {

	@Override
	public Integer mulitiplier() {
		return 1;
	}

	@Override
	public String getPostfix() {
		return "";
	}

}

/**
 * 
 * 项目名称:设计模式 
 * 类名称:ShiExpression   
 * 类描述:十位解释器
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-9 上午10:30:19    
 * @version 1.0   
 *
 */
public class ShiExpression extends Expression {

	@Override
	public Integer mulitiplier() {
		return 10;
	}

	@Override
	public String getPostfix() {
		return "十";
	}

}

/**
 * 
 * 项目名称:dab   
 * 类名称:BaiExpression   
 * 类描述: 百位解释器  
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-4 下午05:03:12    
 * @version 1.0   
 *
 */
public class BaiExpression extends Expression {

	@Override
	public Integer mulitiplier() {
		return 100;
	}

	@Override
	public String getPostfix() {
		return "百";
	}

}

/**
 * 
 * 项目名称:设计模式	
 * 类名称:QianExpression   
 * 类描述:  千位解释器
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-9 上午10:29:47    
 * @version 1.0   
 *
 */
public class QianExpression extends Expression {

	@Override
	public Integer mulitiplier() {
		return 1000;
	}

	@Override
	public String getPostfix() {
		return "千";
	}

}

import java.util.ArrayList;
import java.util.List;
/**
 * 
 * 项目名称:设计模式
 * 类名称:WanExpression   
 * 类描述:万位解释器   
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-9 上午10:31:18    
 * @version 1.0   
 *
 */
public class WanExpression extends Expression {

	@Override
	public Integer mulitiplier() {
		return 10000;
	}

	@Override
	public String getPostfix() {
		return "万";
	}

	@Override
	public void Interpret(Context context) {
		if (context.getInput().length() == 0) {
			return;
		}
		if (context.getInput().endsWith(this.getPostfix())) {
			List<Expression> tree = new ArrayList<Expression>();
			tree.add(new GeExpression());
			tree.add(new ShiExpression());
			tree.add(new BaiExpression());
			tree.add(new QianExpression());

			int temp = context.getOutPut();
			context.setOutPut(0);
			context.setInput(context.getInput().substring(0,context.getInput().length() - this.getPostfix().length()));

			for (Expression e : tree) {
				e.Interpret(context);
			}
			context.setOutPut(temp + mulitiplier() * context.getOutPut());
		}
	}
}

/**
 * 
 * 项目名称:设计模式  
 * 类名称:NumberTest   
 * 类描述: 大写数字测试类 
 * 创建人:YinXiangBing   
 * 创建时间:2014-12-9 上午10:27:40    
 * @version 1.0   
 *
 */
public class NumberTest {
	public static void main(String[] args) {
		String str = "九千九百九十九万九千九百零九";

		Context context = new Context(str);
		WanExpression wan = new WanExpression();
		QianExpression qian = new QianExpression();
		BaiExpression bai = new BaiExpression();
		ShiExpression shi = new ShiExpression();
		GeExpression ge = new GeExpression();
		ge.Interpret(context);
		shi.Interpret(context);
		bai.Interpret(context);
		qian.Interpret(context);
		wan.Interpret(context);
		System.out.println("九千九百九十九万九千九百零九:"+context.getOutPut());
	}
}

运行结果:
九千九百九十九万九千九百零九:99999909

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值