23种设计模式 - 解释器模式

模式定义

解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言(如数控系统的G代码)定义文法规则,并构建解释器来解析和执行该语言的语句。它通过将语法规则分解为多个类,实现复杂指令的逐层解析。


模式结构

抽象表达式(Abstract Expression)

  • 定义interpret()接口,声明解释操作的抽象方法(如void interpret(Context& context))。
    终结符表达式(Terminal Expression)
  • 实现文法中的基本元素(如G代码指令G00G01),直接处理具体操作。
    非终结符表达式(Non-terminal Expression)
  • 处理复合语法结构(如嵌套指令组合),通过递归调用子表达式实现复杂逻辑。
    上下文(Context)
  • 存储解释器所需的全局信息(如机床坐标、刀具状态)。

适用场景

数控系统G代码解析:将G00 X100 Y200等指令转换为机床运动控制。

数学公式计算:解析并执行如(3+5)*2的表达式。

自定义脚本引擎:实现简单控制逻辑的脚本语言。


C++示例(数控G代码解析)

场景说明:

设计一个解释器,解析数控系统的G代码指令(如G00快速定位、G01直线插补),并更新机床坐标。

cpp 复制代码
#include 
#include 
#include 
#include 

// 上下文类:存储机床坐标
class Context {
public:
    float x, y;
    Context() : x(0), y(0) {}
};

// 抽象表达式
class Expression {
public:
    virtual void interpret(Context& context) = 0;
    virtual ~Expression() = default;
};

// 终结符表达式:G00指令(快速移动)
class G00Command : public Expression {
private:
    float targetX, targetY;
public:
    G00Command(float x, float y) : targetX(x), targetY(y) {}
    void interpret(Context& context) override {
        context.x = targetX;
        context.y = targetY;
        std::cout << "快速定位至 (" << context.x << ", " << context.y << ")\n";
    }
};

// 终结符表达式:G01指令(直线插补)
class G01Command : public Expression {
private:
    float targetX, targetY;
public:
    G01Command(float x, float y) : targetX(x), targetY(y) {}
    void interpret(Context& context) override {
        context.x = targetX;
        context.y = targetY;
        std::cout << "直线插补至 (" << context.x << ", " << context.y << ")\n";
    }
};

// 解析器:将字符串指令转换为表达式对象
Expression* parseCommand(const std::string& input) {
    std::istringstream iss(input);
    std::string cmd;
    float x, y;
    iss >> cmd >> x >> y;

    if (cmd == "G00") return new G00Command(x, y);
    else if (cmd == "G01") return new G01Command(x, y);
    return nullptr;
}

// 客户端使用
int main() {
    Context context;
    std::string code = "G00 100 200\nG01 300 150";  // 模拟G代码输入

    std::istringstream stream(code);
    std::string line;
    while (std::getline(stream, line)) {
        Expression* expr = parseCommand(line);
        if (expr) {
            expr->interpret(context);
            delete expr;
        }
    }
    return 0;
}

代码解析

上下文类:存储机床的当前坐标xy

表达式类:

  • G00CommandG01Command为终结符表达式,直接修改坐标并输出动作。
    解析逻辑:parseCommand将输入字符串拆解为指令和参数,生成对应表达式对象。
    执行过程:逐行解析G代码,调用interpret()更新坐标状态。
相关推荐
乐悠小码17 小时前
Java设计模式精讲---02抽象工厂模式
java·设计模式·抽象工厂模式
乙己4071 天前
设计模式——原型模式(prototype)
设计模式·原型模式
⑩-1 天前
浅学Java-设计模式
java·开发语言·设计模式
攻心的子乐1 天前
软考 关于23种设计模式
java·开发语言·设计模式
成钰1 天前
设计模式之单例模式:一个类就只有一个实例
单例模式·设计模式
o0向阳而生0o1 天前
110、23种设计模式之状态模式(19/23)
设计模式·状态模式
_院长大人_1 天前
设计模式-单例模式
单例模式·设计模式
崎岖Qiu2 天前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
安冬的码畜日常2 天前
【JUnit实战3_27】第十六章:用 JUnit 测试 Spring 应用:通过实战案例深入理解 IoC 原理
spring·观察者模式·设计模式·单元测试·ioc·依赖注入·junit5
她说彩礼65万2 天前
C#设计模式 单例模式实现方式
单例模式·设计模式·c#