[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=13770720612900337&size=800_600&devtype=web&v=1.0.1&rtick=14676146422320&share_qid=108635719&sign=03963d0dcc58974e415b96db493b0d66&[/img]
[img]http://chuantu.biz/t5/8/1465807827x3738746553.jpg[/img]
[img]http://chuantu.biz/t5/8/1465807844x3738746553.jpg[/img]
[color=red][b]头文件[/b][/color]
[color=red][b]实现[/b][/color]
[color=red][b]客户端[/b][/color]
[color=red][b]运行结果[/b][/color]
[img]http://chuantu.biz/t5/8/1465807921x3738746553.jpg[/img]
[img]http://chuantu.biz/t5/8/1465807827x3738746553.jpg[/img]
[img]http://chuantu.biz/t5/8/1465807844x3738746553.jpg[/img]
[color=red][b]头文件[/b][/color]
//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
[color=red][b]实现[/b][/color]
#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);
}
}
[color=red][b]客户端[/b][/color]
#include "InterpreterPattern.h"
#include <iostream>
using namespace std;
using namespace InterpreterPattern;
void main()
{
InterpreterPattern_Test();
}
[color=red][b]运行结果[/b][/color]
[img]http://chuantu.biz/t5/8/1465807921x3738746553.jpg[/img]