行为型设计模式之Interpreter(解释器)

行为型设计模式之Interpreter(解释器)

前言:

自己的话理解:自定义一个解释器用来校验参数或数据是否合法。

1)意图

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

2)结构

c 复制代码
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...

相关推荐
饼干哥哥12 小时前
字节Seedance2.5终于上线,这次在收割谁?
人工智能·设计模式·前端框架
董员外13 小时前
RAG 系统进化论(六):GraphRAG(基于知识图谱的 RAG),从相似文本走向实体关系
人工智能·后端·设计模式
鬼鬼鬼15 小时前
从 Prompt 到 Harness:企业级 Agent 工程的完整演进之路
设计模式·架构·ai编程
啦啦啦啦啦zzzz16 小时前
设计模式:原型模式
c++·设计模式·原型模式
董员外17 小时前
RAG 系统进化论(五):Corrective RAG 与 Self-RAG,让系统发现并纠正错误
人工智能·后端·设计模式
workflower20 小时前
高质量数据集的类型
人工智能·机器学习·设计模式·自然语言处理·机器人
啦啦啦啦啦zzzz1 天前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
Nontee2 天前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
choumin2 天前
行为型模式——模板方法模式
c++·设计模式·模板方法模式·行为型模式
啦啦啦啦啦zzzz2 天前
设计模式:建造者模式
c++·设计模式·建造者模式