解释器模式一般用于不同语言的转换,在工作中使用较少。本例中以简单的java转sql示例演示。
package interpreter;
import java.util.HashMap;
import java.util.Map;
public class Context {
private String tableName;
Map<String,String> params=new HashMap<>();
public void addParam(String key,String value) {
params.put(key, value);
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
}
package interpreter;
public interface Interpreter {
void interpret(Context context);
}
package interpreter;
import java.util.Map;
import java.util.Map.Entry;
public class QueryInterpreter implements Interpreter{
@Override
public void interpret(Context context) {
String tableName=context.getTableName();
Map<String,String> params=context.getParams();
StringBuilder sb=new StringBuilder();
sb.append("select * from ");
sb.append(tableName);
sb.append(" where ");
for(Entry<String,String> e:params.entrySet()) {
String key=e.getKey();
String value=e.getValue();
sb.append(key);
sb.append(" = ");
sb.append(value);
sb.append(" and ");
}
String result=sb.replace(sb.lastIndexOf(" and "), sb.length(), ";").toString();
System.out.println(result);
}
}
package interpreter;
import java.util.Map;
import java.util.Map.Entry;
public class DelelteInterpreter implements Interpreter{
@Override
public void interpret(Context context) {
String tableName=context.getTableName();
Map<String,String> params=context.getParams();
StringBuilder sb=new StringBuilder();
sb.append("delete from ");
sb.append(tableName);
sb.append(" where ");
for(Entry<String,String> e:params.entrySet()) {
String key=e.getKey();
String value=e.getValue();
sb.append(key);
sb.append(" = ");
sb.append(value);
sb.append(" and ");
}
String result=sb.replace(sb.lastIndexOf(" and "), sb.length(), ";").toString();
System.out.println(result);
}
}
package interpreter;
public class Client {
public static void main(String[] args) {
Context context=new Context();
context.setTableName("user");
context.addParam("username", "呐撸多");
context.addParam("user_id", "naruto");
Interpreter queryInterpreter=new QueryInterpreter();
queryInterpreter.interpret(context);
DelelteInterpreter delelteInterpreter=new DelelteInterpreter();
delelteInterpreter.interpret(context);
}
}
打印结果:
select * from user where user_id = naruto and username = 呐撸多;
delete from user where user_id = naruto and username = 呐撸多;