解释器模式(Interpreter Pattern)
概念:
· 一种行为型设计模式;
· 核心思想是将文法规则定义为类的层次结构;
· 它把语言的语法规则封装成对象,通过对象之间的组合完成解释的过程;
UML结构:
+---------------------+ | IExpression | <<interface>> +---------------------+ | +Interpret(): bool | +---------------------+ ▲ | ----------------------------- | | | +----------------+ +----------------+ +----------------+ +----------------+ | BoolExpression | | AndExpression | | OrExpression | | NotExpression | +----------------+ +----------------+ +----------------+ +----------------+ | -_val: bool | | -_left:IExpression | -_left:IExpression | -_expression:IExpression | | | | -_right:IExpression| -_right:IExpression| | +----------------+ +----------------+ +----------------+ +----------------+ | +Interpret() | | +Interpret() | +Interpret() | +Interpret() | +----------------+ +----------------+ +----------------+ +----------------+代码示例:
cs/// <summary> /// 解释器接口类 /// </summary> public interface IExpression { /// <summary> /// 解释方法 /// </summary> /// <returns>返回值</returns> bool Interpret(); } /// <summary> /// 终端解释器 /// </summary> public class BoolExpression : IExpression { private bool _val; public BoolExpression(bool val) { this._val = val; } public bool Interpret() { return _val; } } /// <summary> /// 非终端解释器(与操作) /// </summary> public class AndExpression : IExpression { public IExpression _leftExpression; public IExpression _rightExpression; public AndExpression(IExpression leftExpression, IExpression rightExpression) { this._leftExpression = leftExpression; this._rightExpression = rightExpression; } public bool Interpret() { return _leftExpression.Interpret() && _rightExpression.Interpret(); } } /// <summary> /// 非终端解释器(或操作) /// </summary> public class OrExpression : IExpression { public IExpression _leftExpression; public IExpression _rightExpression; public OrExpression(IExpression leftExpression, IExpression rightExpression) { this._leftExpression = leftExpression; this._rightExpression = rightExpression; } public bool Interpret() { return _leftExpression.Interpret() || _rightExpression.Interpret(); } } /// <summary> /// 非终端解释器(非操作) /// </summary> public class NotExpression : IExpression { public IExpression _expression; public NotExpression(IExpression expression) { this._expression = _expression; } public bool Interpret() { return !_expression.Interpret(); } } /// <summary> /// 客户端 /// </summary> public class Client { public static void Main() { IExpression trueExpression = new BoolExpression(true); IExpression falseExpression = new BoolExpression(false); IExpression addExpression = new AndExpression(trueExpression, falseExpression); IExpression orExpression = new OrExpression(trueExpression, falseExpression); IExpression notExpression = new NotExpression(trueExpression); addExpression.Interpret(); orExpression.Interpret(); notExpression.Interpret(); } }特点:
优点:· 易于扩展:新增语法规则即新增类,不影响现有代码,符合开闭原则;
· 文法结构清晰:代码结构与文法结构相对应,便于维护和理解;
· 客户端可以自行组合表达式;
缺点:· 文法的增多会导致类的增多,从而增加了系统的复杂度;
· 解释器的递归调用使得性能的需求增大;
适用场景:
· 问题可以用树形结构表示,则容易将每个语法规则封装成类;
· 当有一种语言需要解释执行,并且语法相对稳定;
· 当希望客户端能够方便地组合不同的表达式进行解释;
举例场景:
· SQL 解析器、正则表达式解释器;
· 计算器的计算表达式的解析;
· 配置文件和脚本语言的解释器;
【设计模式】解释器模式
大飞pkz2025-10-03 11:25
相关推荐
曦樂~1 分钟前
【Qt】启动新窗口--C/S传输信息源代码•宸2 分钟前
Qt6 学习——一个Qt桌面应用程序寻找华年的锦瑟4 分钟前
Qt-UDP橘颂TA5 分钟前
【QSS】软件界面的美工操作——Qt 界面优化Evand J29 分钟前
【MATLAB例程】二维环境定位,GDOP和CRLB的计算,锚点数=4的情况(附代码下载链接)郝学胜-神的一滴35 分钟前
使用现代C++构建高效日志系统的分步指南你不是我我36 分钟前
【Java 开发日记】我们来讲一讲阻塞队列及其应用互联网中的一颗神经元38 分钟前
小白python入门 - 9. Python 列表2 ——从基础操作到高级应用wjs202443 分钟前
PHP 表单:深入浅出地掌握表单处理摇滚侠1 小时前
Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59