来一个大写小转换的例子:
Expression.java
package com.prl.patterns.Interpreter;
import java.util.LinkedHashMap;
import java.util.Map;
public abstract class Expression {
protected Map<String,Integer> table = new LinkedHashMap<String,Integer>();
public Expression(){
table.put("一",1);
table.put("二",2);
table.put("三",3);
table.put("四",4);
table.put("五",5);
table.put("六",6);
table.put("七",7);
table.put("八",8);
table.put("九",9);
}
public void interpret(Context context){
String statment = context.getStatment();
if(statment.length()<= 0){
return;
}
for(Map.Entry<String,Integer> entry:table.entrySet()){
statment = context.getStatment();
String key = entry.getKey();
int value = entry.getValue();
//System.out.println("key="+key+",value="+value);
String endfix = key+getPostfix();
System.out.println("endfix:"+endfix);
if(statment.endsWith(endfix)){
int newData = context.getData() + value*getMultiplier();
String newStatement = context.getStatment().substring(0, context.getStatment().length()-getLenth());
context.setData(newData);
context.setStatment(newStatement);
System.out.println("newData:"+newData+",newStatement="+newStatement);
if(context.getStatment().endsWith("零")){
context.setStatment(context.getStatment().substring(0, context.getStatment().length()-1));
}
break;
}
}
}
public abstract String getPostfix();
public abstract int getMultiplier();
public int getLenth(){
return this.getPostfix().length() + 1;
}
}
GeExpression.java
package com.prl.patterns.Interpreter;
public class GeExpression extends Expression {
@Override
public int getMultiplier() {
return 1;
}
@Override
public String getPostfix() {
return "";
}
}
SiExpression.java
package com.prl.patterns.Interpreter;
public class SiExpression extends Expression {
@Override
public int getMultiplier() {
return 10;
}
@Override
public String getPostfix() {
return "十";
}
}
BaiExpression.java
package com.prl.patterns.Interpreter;
public class BaiExpression extends Expression {
@Override
public int getMultiplier() {
return 100;
}
@Override
public String getPostfix() {
return "百";
}
}
QianExpression.java
package com.prl.patterns.Interpreter;
public class QianExpression extends Expression {
@Override
public int getMultiplier() {
return 1000;
}
@Override
public String getPostfix() {
return "千";
}
}
WanExpression.java
package com.prl.patterns.Interpreter;
import java.util.ArrayList;
import java.util.List;
public class WanExpression extends Expression {
@Override
public int getMultiplier() {
return 10000;
}
@Override
public String getPostfix() {
return "万";
}
@Override
public void interpret(Context context) {
if (context.getStatment().length() == 0)
return;
List<Expression> tree = new ArrayList<Expression>();
tree.add(new GeExpression());
tree.add(new SiExpression());
tree.add(new BaiExpression());
tree.add(new QianExpression());
if (context.getStatment().endsWith(this.getPostfix()))
{
int temp = context.getData();
context.setData(0);
context.setStatment(context.getStatment().substring(0,context.getStatment().length()-1));
for(Expression exp:tree)
{
exp.interpret(context);
}
context.setData(temp+this.getMultiplier()*context.getData());
}
}
}
下面是主程序 :
package com.prl.patterns.Interpreter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class App {
protected Map<String,Integer> table = new HashMap<String,Integer>();
public void initApp(){
table.put("一",1);
table.put("二",2);
table.put("三",3);
table.put("四",4);
table.put("五",5);
table.put("六",6);
table.put("七",7);
table.put("八",8);
table.put("九",9);
}
public void test(){
initApp();
String roman = "二十三万六千四百零五十二";
Context context = new Context(roman);
List<Expression> tree = new ArrayList<Expression>();
tree.add(new GeExpression());
tree.add(new SiExpression());
tree.add(new BaiExpression());
tree.add(new QianExpression());
tree.add(new WanExpression());
for(Expression exp:tree)
{
exp.interpret(context);
}
System.out.println(roman+"="+context.getData());
}
public static void main(String[] args) {
App app = new App();
app.test();
}
}