0
点赞
收藏
分享

微信扫一扫

设计模式:解释器模式(C++)

SPEIKE 2022-01-18 阅读 21

文章目录

一、应用

做一个位数加减法的计算表达式解析,也可以让不同的机器人协同工作,完成不同的工作
在这里插入图片描述

二 、类图解析

三、代码

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
using namespace std;

//抽象的表达式对象以及Context对象
//用于保存计算的中间结果以及当前执行的操作
class Context
{
public:
	int m_value;
	char m_operator;
	Context():m_value(0),m_operator('\0')
	{}
};

//表示所有表达式的抽象接口
class IExpression
{
public:
	virtual void Eval(Context* p) = 0;
};

//拆分表达式的元素
class Operator:public IExpression
{
public:
	Operator(char op)	//构造函数
	{
		this->m_op = op;
	}

	void Eval(Context* pContext) //执行函数,拆分表达式
	{
		pContext->m_operator = m_op;
	}
pRivate:
	char m_op;
};

//拆分操作数
class Operand:public IExpression
{
public:
	Operand(int num)
	{
		this->m_num = num;
	}
	void Eval(Context* pContext)
	{
		switch(pContext->m_operator)
		{
		case '\0': 
			pContext->m_value = m_num;
			break;
		case '+':
			pContext->m_value += m_num;
			break;
		case '-':
			pContext->m_value -= m_num;
			break;
		default:
			break;
		}
	}
private:
	int m_num;
};

//计算器
class Calculator
{
public:
	int Calc(string expression)
	{
		Context* pContext = new Context;
		vector<IExpression*> tree;
		for(int i = 0;i < expression.size();++i)
		{
			if((expression[i] == '+') || (expression[i] == '-'))
			{
				tree.push_back(new Operator(expression[i]));
				printf("第%d次压入的符号是=%c",i,expression[i]);
			}
			else
			{
				tree.push_back(new Oprand((int)(expression[i]-48)));//压进来的就是数字
				printf("第%d次压入的数字是=%d",i,(int)(expression[i]-48));
			}
		}
		for(vector<IExpression*>::iterarot iter = tree.begin();iter != tree.end();++iter)
		{
			(*iter)->Eval(pContext);
			printf("value = %d.oper = %c\n",pContext->m_vlaue,pContext->m_operator);
		}
	}
	return pContext->m_value;
};

int main()
{
	Caluelator* pc = new Caluelator;
	std::cout<<"1+4-2 = "<<pc->Calc("1+4-2")<<std::endl;
	systeam("pause");
	return 0;
}

四、运算结果

在这里插入图片描述

举报

相关推荐

0 条评论