`

[行为型模式] 解释器模式的理解

 
阅读更多



头文件
//InterpreterPattern.h

#ifndef INTERPRETER_PATTERN_H
#define INTERPRETER_PATTERN_H

#include <Windows.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;

namespace InterpreterPattern
{
    //////////////////////////////////////////////////////////////////////////
    class Context
    {
    private:
        map<string, int> m_cValueMap;

    public:
        void addValue(string key,int value);
        int getValue(string key);
    };

    //////////////////////////////////////////////////////////////////////////
    class AbstractExpression
    {
    public :
        virtual int interpreter(Context context) = 0;
    };

    //////////////////////////////////////////////////////////////////////////
    class AddNonterminalExpression : public AbstractExpression
    {
    private :
        AbstractExpression* m_pLeft;
        AbstractExpression* m_pRight;

    public:
        AddNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight);
        int interpreter(Context cContext);
    };

    //////////////////////////////////////////////////////////////////////////
    class SubtractNonterminalExpression : public AbstractExpression
    {
    private :
        AbstractExpression* m_pLeft;
        AbstractExpression* m_pRight;

    public:
        SubtractNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight);
        int interpreter(Context cContext);
    };

    //////////////////////////////////////////////////////////////////////////
    class TerminalExpression : public AbstractExpression
    {
    private :
        int i;

    public :
        TerminalExpression(int i);
        int interpreter(Context cContext);
    };

    //////////////////////////////////////////////////////////////////////////
    void InterpreterPattern_Test();
}

#endif


实现
#include "InterpreterPattern.h"

namespace InterpreterPattern
{
    //////////////////////////////////////////////////////////////////////////
    void Context::addValue(string key,int value)
    {
        m_cValueMap.insert(std::pair<string,int>(key,value));
    }

    int Context::getValue(string key)
    {
        return m_cValueMap[key];
    }

    //////////////////////////////////////////////////////////////////////////
    AddNonterminalExpression::AddNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight)
    {
        this->m_pLeft = pLeft;
        this->m_pRight = pRight;
    }

    int AddNonterminalExpression::interpreter(Context cContext)
    {
        return this->m_pLeft->interpreter(cContext) + this->m_pRight->interpreter(cContext);
    }

    //////////////////////////////////////////////////////////////////////////
    SubtractNonterminalExpression::SubtractNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight)
    {
        this->m_pLeft =  pLeft;
        this->m_pRight = pRight;
    }

    int SubtractNonterminalExpression::interpreter(Context cContext)
    {
        return this->m_pLeft->interpreter(cContext) - this->m_pRight->interpreter(cContext);
    }

    //////////////////////////////////////////////////////////////////////////
    TerminalExpression::TerminalExpression(int i)
    {
        this->i = i;
    }

    int TerminalExpression::interpreter(Context cContext)
    {
        return this->i;
    }

    //////////////////////////////////////////////////////////////////////////
    void InterpreterPattern_Test()
    {
        //a-b+c
        Context cContext;
        cContext.addValue("a", 7);
        cContext.addValue("b", 8);
        cContext.addValue("c", 2);

        SubtractNonterminalExpression* pSubtractValue = new SubtractNonterminalExpression(new TerminalExpression(
            cContext.getValue("a")), new TerminalExpression(cContext.getValue("b")));

        AddNonterminalExpression* pAddValue = new AddNonterminalExpression(pSubtractValue, new TerminalExpression(
            cContext.getValue("c")));

        cout<< pAddValue->interpreter(cContext);
    }
}


客户端
#include "InterpreterPattern.h"


#include <iostream>
using namespace std;
using namespace InterpreterPattern;

void main()
{
    InterpreterPattern_Test();
}

运行结果
分享到:
评论

相关推荐

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    11. **解释器模式**:定义一个语言的文法,并提供一个解释器来处理这个文法。 设计模式的使用可以提高代码的可读性、可维护性和可扩展性,是软件工程中的重要工具。理解和熟练应用设计模式,可以帮助开发者解决常见...

    C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释器模式 (Level 300)

    解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并允许你使用该表示来解释语言中的句子。在C#中,解释器模式常用于构建自定义的编程语言或者解析特定格式的数据,例如配置文件、表达式计算等。 ...

    设计模式之解释器

    解释器模式是一种行为型设计模式,主要用于处理语言的文法规则、算术规则等问题。它通过定义语言的文法,并根据该文法来解释句子,使得我们可以用统一的方式处理各种语言结构。本文将通过具体的例子——加减运算来...

    Ansy.rar_C语言解释器_解释 语言_解释器_解释器模式_语言解释器

    根据GOF(GoF,设计模式:可复用面向对象软件的基础)的设计原则,解释器模式是一种行为设计模式,用于创建能解析特定语言的解释器。在这个模式中,每个语言的表达式都会被表示为一个类,而这些类共同构成了一个语法...

    设计模式之解释器模式(Interpreter Pattern)

    解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并实现一个解释器用于解析这种语法的语句。这种模式通常用于小型、特定领域的语言(DSL)实现,比如配置文件、简单的脚本或计算表达式。在计算机...

    第十七讲:解释器模式

    使用解释器模式的一个例子是在文本编辑器中实现自定义的脚本语言,用户可以编写简单的脚本来控制编辑器的行为。解释器则负责解析这些脚本并执行相应的操作。 在实际开发中,解释器模式的优点包括: 1. **灵活性**:...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    设计模式3-行为型模式.doc

    在上述内容中,提到了七种行为型设计模式,分别是责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式。 1. **责任链模式**:责任链模式的核心是建立一个对象链,每个对象都有处理请求的能力,...

    设计模式-解释器模式(讲解及其实现代码)

    **解释器模式**是一种行为设计模式,它提供了一种方式来表示语言的语法,并通过类和对象解析这种语法。在编程领域,解释器模式常用于创建简单的语言或表达式解析器,例如配置文件、计算器应用或者SQL查询的简化版本...

    解释器模式(Interpreter)原理图

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...

    设计模式_行为模式

    3. 解释器模式(Interpreter):解释器模式提供了一种方式来表示语言的语法,并允许动态解析给定的表达式。它常用于构建简单的语言解释器或者表达式求值。 4. 迭代器模式(Iterator):迭代器模式提供了一种顺序...

    基于Python的行为型模式设计.zip

    9. **解释器模式**:解释器模式为语言的文法提供了一个解析器,常用于小型语言的实现。Python的语法解析库如`pyparsing`和`ply`可以帮助实现这个模式。 10. **状态模式**:状态模式允许对象在内部状态改变时改变它...

    java设计模式解释

    解释器模式是一种行为型设计模式,它定义一个新的语言的文法,并且建立一个解释器来解释该语言中的句子。这里的“语言”是指使用规定格式和语法的代码。 **应用场景:** 当一个语言需要解释执行,且这个语言的文法...

    实验5:行为型模式应用实验(2)

    首先,我们要了解行为型模式分为两大类:责任链模式、解释器模式、迭代器模式、命令模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式以及访问者模式。这些模式各有特点,解决不同的设计问题。 例如...

    设计模式-解释器模式

    **解释器模式**是一种行为设计模式,它提供了一种方式来表示语言或表达式的语法,并通过解析这些语法来执行相关操作。在iOS开发中,解释器模式常常用于处理简单的脚本或表达式,例如在运行时计算数学表达式、解析...

    设计模式解释器模式PPT学习教案.pptx

    解释器模式是一种行为设计模式,它提供了一种方式来表示一种特定的语言,并创建一个解释器来解析这种语言的句子。在计算机科学中,解释器模式常用于构建小型的自定义语言,如计算器应用中的表达式解析。 在介绍解释...

Global site tag (gtag.js) - Google Analytics