『デザインモード』学習ノート——解釈器モード


インタプリタ・モード(Interpreter Pattern)は、動作モードに属する言語の構文または式を評価する方法を提供します.このモードは、特定のコンテキストを説明する式インタフェースを実現する.このパターンはSQL解析,シンボル処理エンジンなどに用いられる.
意図:言語を指定し、文法表現を定義し、言語内の文を説明するために識別を使用する解釈器を定義します.主な解決:いくつかの固定文法に対して文を解釈する解釈器を構築する.いつ使用するか:特定のタイプの問題が発生する頻度が十分に高い場合、その問題の各インスタンスを単純な言語の文として記述する価値がある可能性があります.これにより、これらの文を解釈することによって問題を解決する解釈器を構築することができる.解決方法:コンポーネント構文ツリーで、終端と非終端を定義します.キーコード:コンポーネント環境クラスで、解釈器以外のグローバル情報が含まれています.一般的にはHashMapです.適用例:コンパイラ、演算式計算.利点:1、拡張性が高く、柔軟性がある.2、新しい解釈式を追加しました.3、簡単な文法を実現しやすい.短所:1、利用できるシーンが少ない.2、複雑な文法はメンテナンスが難しい.3、解釈器モードはクラス膨張を引き起こす.4、解釈器モードは再帰呼び出し方法を採用する.使用シーン:1、実行を説明する言語の文を抽象構文ツリーとして表すことができます.2、いくつかの繰り返しの問題は簡単な言語で表現することができます.3、簡単な文法で説明するシーン.注意事項:利用可能シーンが少ないので、JAVAで遭遇した場合はexpression 4 Jで代用できます.
InterpreterPattern.h
#pragma once
#include
#include
// Context
// Expression
// PlusExpression MinusExpression

class Context
{
public:
	Context(int num):m_num(num){}
	void setNum(int num)
	{
		m_num = num;
	}
	int getNum(void)
	{
		return m_num;
	}
	void setRes(int res)
	{
		m_res= res;
	}
	int getRes(void)
	{
		return m_res;
	}
private:
	int m_num;
	int m_res;

};

//       
class Expression
{
public:
	Expression(Context* context) :m_context(context) {}
	virtual void Interpreter(Context* context) = 0;
private:
protected:
	Context * m_context;
};
//   
class PlusExpression:public Expression
{
public:
	PlusExpression(Context* context) :Expression(context) {}
	//     
	virtual void Interpreter(Context* context)
	{
		int num = context->getNum();
		num++;
		context->setNum(num);
		context->setRes(num);
	}

};
//   
class MinusExpression :public Expression
{
public:
	MinusExpression(Context* context) :Expression(context) {}
	//     
	virtual void Interpreter(Context* context)
	{
		int num = context->getNum();
		num--;
		context->setNum(num);
		context->setRes(num);
	}

};
class InterpreterPattern
{
public:
	InterpreterPattern() {};
	~InterpreterPattern() {};
};


 
InterpreterPattern.cpp
#include "InterpreterPattern.h"

 
mainTest.cpp
#include
#include
#include "InterpreterPattern.h"

int main(void)
{
	//        
	Expression* expression = nullptr;
	//         
	Expression* expression2 = nullptr;
	Context* context = new Context(10);

	//      
	std::cout << context->getNum() << std::endl;

	//          
	expression = new PlusExpression(context);
	//   
	expression->Interpreter(context);
	//      
	std::cout << context->getRes() << std::endl;

	//          
	expression2 = new MinusExpression(context);
	//   
	expression2->Interpreter(context);
	//      
	std::cout << context->getRes() << std::endl;

	system("pause");
	return 0;
}