25.解释器模式--Interpreter

原文地址:http://blog.csdn.net/jjunjoe/article/details/6694845

Interpreter模式:
Interpreter模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

Interpreter模式需要解决的的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

Interpreter模式可以很容易的改变和扩展文法,因为该模式使用类来表示文法规则,可以使用集成来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树种各个节点的类的实现大体类似,这些类都抑郁直接编写。

Interpreter模式 也有不足,Interpreter模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。

Interpreter模式典型的结构图为:
 25.解释器模式--Interpreter_第1张图片


Interpreter的实现代码如下:

//Context.h
#ifndef _CONTEXT_H_
#define _CONTEXT_H_
class Context
{
public:
    Context();
    ~Context();
protected:
private:
};
#endif //~_CONTEXT_H_


//Context.cpp
#include "Context.h"
Context::Context()
{
}
Context::~Context()
{
}


//Interpret.h
#ifndef _INTERPRET_H_
#define _INTERPRET_H_
#include "Context.h"
#include <string>
using namespace std;
class AbstractExpression
{
public:
    virtual ~AbstractExpression();
    virtual void Interpret(const Context& c);
protected:
    AbstractExpression();
private:
};
class TerminalExpression:public AbstractExpression
{
public:
    TerminalExpression(const string& statement);
    ~ TerminalExpression();
    void Interpret(const Context& c);
protected:
private:
    string _statement;
};
class NonterminalExpression:public AbstractExpression
{
public:
    NonterminalExpression(AbstractExpression* expression,int times);
    ~ NonterminalExpression();
    void Interpret(const Context& c);
protected:
private:
    AbstractExpression* _expression;
    int _times;
};
#endif //~_INTERPRET_H_


//interpret.cpp
#include "Interpret.h"
#include <iostream>
using namespace std;
AbstractExpression::AbstractExpression()
{
}
AbstractExpression::~AbstractExpression()
{
}
void AbstractExpression::Interpret(const Context& c)
{
}
TerminalExpression::TerminalExpression(const string& statement)
{
    this->_statement = statement;
}
TerminalExpression::~TerminalExpression()
{
}
void TerminalExpression::Interpret(const Context& c)
{
    cout<<this->_statement<<" TerminalExpression"<<endl;
}
NonterminalExpression::NonterminalExpression(AbstractExpression* expression,int times)
{
    this->_expression = expression;
    this->_times = times;
}
NonterminalExpression::~NonterminalExpression()
{
}
void NonterminalExpression::Interpret(const Context& c)
{
    for (int i = 0; i < _times ; i++)
    {
        this->_expression->Interpret(c);
    }
}


//main.cpp
#include "Context.h"
#include "Interpret.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
    Context* c = new Context();
    AbstractExpression* te = new TerminalExpression("hello");
    AbstractExpression* nte = new NonterminalExpression(te,2);
    nte->Interpret(*c);
    return 0;
}

至此,算是将各个设计模式过了一遍,很佩服许多高手能够领悟到设计模式的精髓,并准确的表达出来(比如《大话设计模式》的作者,真是名副其实的大鸟)。而我由于个人的慵懒加上资质平平,总是感觉无法领悟到深处,更谈不上能在项目中灵活运用和正确选择何时该使用哪个模式了。唯一能告诉自己的就是继续学习,继续努力,点滴积累。

我的一系列笔记中都有参考电子档《设计模式精解-GoF 23种设计模式解析》,此电子档在网上流传很广,文档中有http://www.mscenter.edu.cn/blog/k_eckel 应该是该文档的出处吧,可我一直打不开这个链接,在这里对原创者表示尊敬和感谢,是你们的无私奉献让后学者不至于一开始就啃GOF的天书。



你可能感兴趣的:(25.解释器模式--Interpreter)