1. 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2. 示例: 可以通过解释器实现对英语短语的翻译,类图如下
/**
* @author beck.yang
* @date 2022/7/12 14:32
* @description 解释器接口
*/
public interface Expression {
String interpret(String context);
}
/**
* @author beck.yang
* @date 2022/7/12 14:41
* @description 结束符解释器
*/
public class EndExpression implements Expression {
private String endStr;
public EndExpression(String endStr) {
this.endStr = endStr;
}
@Override
public String interpret(String context) {
return endStr != null && endStr.equals(context) ?
null : context;
}
}
import java.util.HashMap;
import java.util.Map;
/**
* @author beck.yang
* @date 2022/7/12 14:38
* @description 英语解释器
*/
public class EnglishExpression implements Expression {
private static Map<String, String> expressionMap = new HashMap<>();
static {
expressionMap.put("hi", "你好");
expressionMap.put("hello", "哈喽");
expressionMap.put("i", "我");
expressionMap.put("miss", "想");
expressionMap.put("you", "你");
}
@Override
public String interpret(String context) {
String s = expressionMap.get(context.toLowerCase());
return s == null ? context : s;
}
}
/**
* @author beck.yang
* @date 2022/7/12 14:30
* @description 解释器模式
*/
public class Main {
public static void main(String[] args) {
String s = "Hi , i miss you .";
Expression endExpression = new EndExpression(".");
Expression englishExpression = new EnglishExpression();
for (String context : s.split(" ")) {
String end = endExpression.interpret(context);
if (end == null) {
break;
}else {
System.out.print(englishExpression.interpret(context) + " ");
}
}
}
}
解释器主要就是封装一个解释器类,对复杂重复的语义进行翻译或转换,一版会循环调用或者递归调用,调用次数较多...