行为型设计模式之Interpreter(解释器)
前言:
自己的话理解:自定义一个解释器用来校验参数或数据是否合法。
1)意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语音中的句子。
2)结构
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* @author psd 行为设计模式之解释器模式
*/
public class InterpreterPattern {
public static void main(String[] args) {
Context context = new Context();
context.check("江苏的南京");
context.check("南京的一哥");
context.check("南京的芜湖");
context.check("安徽的合肥");
System.out.println("------------");
context.check("合肥的马鞍山");
}
}
/**
* 表达式接口
*/
interface Expression {
/**
* 解释器 判断是否合法
*
* @param context
* 文本信息
* @return 是否合法
*/
boolean interpret(String context);
}
class Context{
private String[] prefixArr = {"江苏","安徽","南京"};
private String[] suffixArr = {"南京","苏州","合肥","马鞍山","芜湖", "|州","一哥","马鞍山"};
private NonterminalExpression nonterminalExpression;
public Context() {
TerminalExpression presix = new TerminalExpression(prefixArr);
TerminalExpression suffix = new TerminalExpression(suffixArr);
nonterminalExpression = new NonterminalExpression(presix, suffix);
}
public void check(String info) {
boolean result = nonterminalExpression.interpret(info);
if (result) {
System.out.println("识别成功.....");
} else {
System.out.println("识别失败.....");
}
}
}
/**
* 非终端表达式
*/
class NonterminalExpression implements Expression {
private TerminalExpression presix;
private TerminalExpression suffix;
public NonterminalExpression(TerminalExpression presix, TerminalExpression suffix) {
this.presix = presix;
this.suffix = suffix;
}
@Override
public boolean interpret(String context) {
String[] splitStr = context.split("的");
// 判断前缀和后缀是否合法
return presix.interpret(splitStr[0]) && suffix.interpret(splitStr[1]);
}
}
/**
* 终端表达式
*/
class TerminalExpression implements Expression {
private Set<String> set = new HashSet<>();
public TerminalExpression(String[] data) {
Collections.addAll(set, data);
}
/**
* 判断是否合法
*
* @param context
* 文本信息
* @return 是否合法
*/
@Override
public boolean interpret(String context) {
return set.contains(context);
}
}
3)适用性
Interpreter模式适用于当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽
象语法树时,以下情况效果最好:
- 该文法简单。对于复杂的发文,文法的类层次变得庞大而无法管理。
- 效率不是一个关键问题。最高效的解释器通常不是通过直接解释语法分析树实现的,
而是首先将它们转换成另一种形式。
总结:何时选择解释器模式
场景特征 例子
需解析领域特定语言(DSL) 金融公式、业务规则表达式
频繁处理结构化查询/过滤条件 自定义日志过滤器、数据查询
简单语法且变化不频繁 数学表达式、布尔逻辑解析
动态执行用户定义的规则 游戏AI条件、促销活动规则引擎
喜欢我的文章记得点个在看,或者点赞,持续更新中ing…