【设计模式】解释器模式

解释器模式(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 解析器、正则表达式解释器;

· 计算器的计算表达式的解析;

· 配置文件和脚本语言的解释器;

相关推荐
小艳加油几秒前
生态学研究突破:利用R语言多元算法实现物种气候生态位动态分析与分布预测,涵盖数据清洗、模型评价到论文写作全流程
开发语言·算法·r语言
程序猿_极客4 分钟前
【2025 最新】 Maven 下载安装与配置教程(超详细带图文Windows 版):从入门到实战
java·开发语言·windows·maven·maven安装
朴shu9 分钟前
揭秘高性能协同白板:轻松实现多人实时协作(一)
前端·设计模式·架构
励志前端小黑哥11 分钟前
uv包管理器--python也有自己的pnpm了
开发语言·python·uv
PfCoder31 分钟前
C# async / await 用法以及和Task的关系
c#·多线程·winform·async、await
阿龍178737 分钟前
媒体文件问题检测脚本(一)(python+ffmpeg)
开发语言·python
2501_941111841 小时前
分布式日志系统实现
开发语言·c++·算法
未来之窗软件服务1 小时前
幽冥大陆(二十三)python语言智慧农业电子秤读取——东方仙盟炼气期
开发语言·python·仙盟创梦ide·东方仙盟·东方仙盟sdk·东方仙盟浏览器
不会c嘎嘎1 小时前
C++ -- stack和queue
开发语言·c++·rpc
CodeByV2 小时前
【C++】C++11:其他重要特性
开发语言·c++