【设计模式】解释器模式

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

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

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

相关推荐
曦樂~1 分钟前
【Qt】启动新窗口--C/S传输信息
开发语言·qt
源代码•宸2 分钟前
Qt6 学习——一个Qt桌面应用程序
开发语言·c++·经验分享·qt·学习·软件构建·windeployqt
寻找华年的锦瑟4 分钟前
Qt-UDP
开发语言·qt·udp
橘颂TA5 分钟前
【QSS】软件界面的美工操作——Qt 界面优化
开发语言·qt·c/c++·界面设计
Evand J29 分钟前
【MATLAB例程】二维环境定位,GDOP和CRLB的计算,锚点数=4的情况(附代码下载链接)
开发语言·matlab·定位·toa·crlb·gdop
郝学胜-神的一滴35 分钟前
使用现代C++构建高效日志系统的分步指南
服务器·开发语言·c++·程序人生·个人开发
你不是我我36 分钟前
【Java 开发日记】我们来讲一讲阻塞队列及其应用
java·开发语言
互联网中的一颗神经元38 分钟前
小白python入门 - 9. Python 列表2 ——从基础操作到高级应用
java·开发语言·python
wjs202443 分钟前
PHP 表单:深入浅出地掌握表单处理
开发语言
摇滚侠1 小时前
Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
java·开发语言·spring boot·笔记