C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 概念

    • 概念 - 概述
    • 概念 - 计算机专有名词
    • 概念 - 正向代理和反向代理
    • 概念 - 云网络
    • 概念 - rest api
    • 概念 - 脑裂
  • 理论

    • 事务理论 - ACID
    • 分布式理论 - CAP
    • 分布式理论 - BASE
  • 架构设计原则

    • 架构设计原则 - 合适、简单、演化
    • 架构设计原则 - 高内聚、低耦合
    • 架构设计原则 - 正交四原则
    • 架构设计原则 - SOLID详解
    • 架构设计原则 - 分层架构MVC
    • 架构设计原则 - DDD领域驱动设计:贫血模型和充血模型
    • 架构设计原则 - DDD领域驱动设计
  • 设计模式

    • 创建型模式 - Create model

      • 创建型模式 - 单例模式(Singleton)
      • 创建型模式 - 工厂模式(Factory)
      • 创建型模式 - 抽象工厂(Abstract Factory)
      • 创建型模式 - 生成器(Builder)
      • 创建型模式 - 原型模式(Prototype)
    • 结构型模式 - Structural model

      • 结构型模式 - 外观(Facade)
      • 结构型模式 - 适配器(Adapter)
      • 结构型模式 - 桥接(Bridge)
      • 结构型模式 - 组合(Composite)
      • 结构型模式 - 装饰(Decorator)
      • 结构型模式 - 享元(Flyweight)
      • 结构型模式 - 代理(Proxy)
    • 行为型模式 - Behavioral model

      • 行为型模式 - 责任链(Chain Of Responsibility)
      • 行为型模式 - 策略(Strategy)
      • 行为型模式 - 模板模式(Template)
      • 行为型模式 - 命令模式(Command)
      • 行为型模式 - 观察者(Observer)
      • 行为型模式 - 访问者(Visitor)
      • 行为型模式 - 状态(State)
      • 行为型模式 - 解释器(Interpreter)
      • 行为型模式 - 迭代器(Iterator)
      • 行为型模式 - 中介者(Mediator)
      • 行为型模式 - 备忘录(Memento)
  • 协议

    • 协议 - Http
    • 协议 - SNMP
    • 协议 - NETCONF
    • 协议 - TLS和SSL
    • 协议 - Http-wiki
    • 协议 - TCP/IP
    • 协议 - Https常见的认证模式
  • 技术选型

    • 技术选型 - 常用的技术框架
    • 技术选型 - 如何写一个自己的项目
    • 技术选型 - 基于drogon实现用户中心后端
  • 编码规范

    • 编码规范 - Google C++ Style Guide
    • 编码规范 - 编程风格
    • 编码规范 - 头文件包含规范
    • 编码规范 - 常用编码命名规则
    • 编码规范 - 编码命名规范

行为型 - 解释器(Interpreter)

Interpreter 模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子。

​[[toc]]

概念

Interpreter 模式提供了这样的一个实现语法解释器的框架, Interpreter 模式典型的结构图为:

Interpreter 模式中,提供了 TerminalExpression 和 NonterminalExpression 两种表达式的解释方式,Context 类用于为解释过程提供一些附加的信息(例如全局的信息)

代码实现

模型代码实现

#ifndef _CONTEXT_H_
#define _CONTEXT_H_
class Context
{
public:
	Context();
	~Context();

protected:
private:
};
#endif //~_CONTEXT_H_

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

#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_

#include "Interpreter.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);
    }
}

#include "Context.h"
#include "Interpreter.h"
#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{
	Context *c = new Context();
	AbstractExpression *te = new TerminalExpression("hello");
	te->Interpret(*c);

	AbstractExpression *nte = new NonterminalExpression(te, 2);
	nte->Interpret(*c);
	return 0;
}

符号运算实现

#include <iostream>
#include <map>
#include <stack>
using namespace std;

class Expression
{
public:
	virtual int interpreter(map<char, int> var) = 0;
	virtual ~Expression() {}
};

//变量表达式
class VarExpression : public Expression
{
	char key;

public:
	VarExpression(const char &key)
	{
		this->key = key;
	}
	int interpreter(map<char, int> var) override
	{
		return var[key];
	}
};
//符号表达式
class SymbolExpression : public Expression
{
	// 运算符左右两个参数
protected:
	Expression *left;
	Expression *right;

public:
	SymbolExpression(Expression *left, Expression *right) : left(left), right(right)
	{
	}
};
//加法运算
class AddExpression : public SymbolExpression
{
public:
	AddExpression(Expression *left, Expression *right) : SymbolExpression(left, right)
	{
	}
	int interpreter(map<char, int> var) override
	{
		return left->interpreter(var) + right->interpreter(var);
	}
};

//减法运算
class SubExpression : public SymbolExpression
{

public:
	SubExpression(Expression *left, Expression *right) : SymbolExpression(left, right)
	{
	}
	int interpreter(map<char, int> var) override
	{
		return left->interpreter(var) - right->interpreter(var);
	}
};

Expression *analyse(const string &expStr)
{
	stack<Expression *> expStack;
	Expression *left = nullptr;
	Expression *right = nullptr;
	for (int i = 0; i < expStr.size(); i++)
	{
		switch (expStr[i])
		{
		case '+':
			// 加法运算
			left = expStack.top();
			right = new VarExpression(expStr[++i]);
			expStack.push(new AddExpression(left, right));
			break;
		case '-':
			// 减法运算
			left = expStack.top();
			right = new VarExpression(expStr[++i]);
			expStack.push(new SubExpression(left, right));
			break;
		default:
			// 变量表达式
			expStack.push(new VarExpression(expStr[i]));
		}
	}
	Expression *expression = expStack.top();
	return expression;
}

int main()
{
	string expStr = "a+b-c+d-e";
	map<char, int> var;
	var.insert(make_pair('a', 1));
	var.insert(make_pair('b', 2));
	var.insert(make_pair('c', 3));
	var.insert(make_pair('d', 4));
	var.insert(make_pair('e', 5));

	Expression *expression = analyse(expStr);
	int result = expression->interpreter(var);
	cout << result << endl;
	return 0;
}

Last Updated:
Contributors: klc407073648
Prev
行为型模式 - 状态(State)
Next
行为型模式 - 迭代器(Iterator)