解释器模式

解释器模式

解释器模式和适配器模式是比较相似的,只不过适配器是接口转化。而解释器模式倾向于不同系统之间的对话转化。比如你用的Google翻译,就相当于把你输入的语言转换成了目标语言,你以为google翻译的时候,使用的是爱情公寓里面的小黑人工翻译吗?其实不是,实际上使用的是一种库,你可以理解为他是一个解释工厂,你输入一个语言,然后他会把这解释转化成你需要语言,而这种解决问题的方法就叫做解释器模式,解释器模式就是给定一个语言,定义它的语法,然后给你一个解释器,对你的输入进行解释,转换成你需要的语言(类比Google翻译,将你的输入解释成你所选择的目标语言)。

 

AbstacctExpression:抽象表达式,就是翻译的时候,解释器中各部分的共同数据和方法

AbstractExpression和AbstractExpression:翻译的具体的部分,这两个部分和你所需要解释的对象有关,比如英语,你可能需要先翻译单词、然后抽取语法、是否存在一些口头上的特殊搭配、特殊的标点符号等等,这些都是是需要在这个子类部分完成的处理

Contex:解释器之外的数据和信息,常用于存储输入和输出、一些中间数据等等

使用场景:

  • 需要对输入的语言或者句子需要进行解析的时候
  • 需要建立一个抽象语法树的时候

优点:

  • 容易改变和拓展文法变化,并且增加了新的解释方法

缺点:

  • 可用的场景不多
  • 太过于复杂的文法,会使得类很多
  • 调用的时候需要使用递归(单词、语法、特殊等等都要解释),可能造成时间浪费

 

实操

 

在开发的过程,很容易感觉到解释器方法很好,但是对于解释器的具体解释类很容易拓展但是也容易复杂。而且在写代码的时候,也会觉得客户端调用的麻烦,我想在实际操作中,用户和解释器组之间应该存在一个中间件对用户输入进行分类挑选,然后再去调用合适的解释模块和策略。

思路:

  1. 定义Context解释器外部类,把输入和输出进行存储,实际还可以存储许多中间数据,因为递归内存消耗不好说
  2. 给定CJapanseTrans基础类,给定外部调用接口就像,简单来说就是这个类基本上决定了你解释器需要解释的是什么东西了
  3. 完成CNun和CText,对需要解释的东西进行语法分析,对应的类解释对应的需求,而不是在一个类里面完全解释清楚
// ExpressionModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

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

class CContext
{
private:
    string m_inContext;
    string m_outContext;
public:
    void setInContext(string inStr) { m_inContext = inStr; }
    string getInContext() { return m_inContext; }

    void setOutContext(string outStr) { m_outContext = outStr; }
    string getOutContext() { return m_outContext; }
};

class CJapanseTrans
{
public:
    virtual void toTrans(CContext* context) {}
};
class CTextTrans : public CJapanseTrans
{
public:
    void toTrans(CContext* context)
    {
        if (context && context->getInContext() == "1")
        {
            cout<<"这里应该是你好的日语。"<<endl;
        }
    }
};
class CNumTrans :public CJapanseTrans
{
public:
    void toTrans(CContext *context)
    {
        if (context && context->getInContext() == "44")
        {
            cout << "这里应该44的日语。" << endl;
        }
    }
};


int main()
{
    CContext text;
    text.setInContext("1");

    CJapanseTrans* trans = new CTextTrans;
    trans->toTrans(&text);

    text.setInContext("44");
    CJapanseTrans* trans1 = new CNumTrans;
    trans1->toTrans(&text);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值