解释器模式

来源:互联网 发布:解压war linux tar 编辑:程序博客网 时间:2024/05/16 16:12

解释器模式

  • 解释器模式
    • 概念
    • 角色及职责
    • 案例

概念

解释器模式是行为型模式之一,描述了如何为简单的语言定义一套语法,如何在该语言中表示一个句子,以及如何解释这些句子,然后执行相应的动作和行为!

角色及职责

这里写图片描述

  • Context
    解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。

  • AbstractExpression
    解释器抽象类。

  • ConcreteExpression
    解释器具体实现类。

案例

#include <iostream>using namespace std;/*上下文环境--客户端通过他获取解释结果*/class Context{public:    Context(int num)//上下文环境需要一个构造函数--存放待解释的信息    {        this->m_num = num;    }    int getNum()    {        return m_num;    }    int getRes()//返回结果    {        return m_res;    }    void setNum(int num)    {        this->m_num = num;    }    void  setRes(int res)    {        this->m_res = res;    }private:    /*待解释的内容*/    int m_num;    /*解释后的结果*/    int m_res;};/*抽象解释器--定义了解释行为函数*/class Expression{public:    virtual void  interpreter(Context *context) = 0;private:    Context     *m_context;//解释器里面含有上下文环境做成员变量--以便提取待解释的信息};//加法--具体解释器--实现基类纯虚函数class PlusExpression : public Expression{public:    PlusExpression()//纯虚函数    {        this->context = NULL;    }    virtual void  interpreter(Context *context)//模拟解释的过程    {        int num = context->getNum();        num ++;        context->setNum(num);//设置解释结果到上下文环境        context->setRes(num);    }private:    Context *context;//解释器里面含有上下文环境做成员变量--以便提取待解释的信息};// 减法--具体解释器class MinusExpression : public Expression{public:    MinusExpression()    {        this->context = NULL;    }    virtual void  interpreter(Context *context)    {        int num = context->getNum();        num -- ;        context->setNum(num);        context->setRes(num);    }private:    Context *context;};/*测试案例*/int main(){    Expression      *expression = NULL;    Context         *context = NULL;    Expression      *expression2 = NULL;    context = new Context(10);    cout << context->getNum() << endl;    expression = new PlusExpression;    expression->interpreter(context);    cout << context->getRes() << endl;    expression2 = new MinusExpression;    expression2->interpreter(context);    cout << context->getRes() << endl;    return 0;}
0 0