23种设计模式之(二十二)解释器模式(Interpreter)
本文主要介绍23种设计模式之解释器模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接
解释器模式(Interpreter)
概念
解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
GoF对解释器模式的定义是:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
应用场景
(1)、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
(2)、一些重复出现的问题可以用一种简单的语言来进行表达。
(3)、一个简单语法需要解释的场景。
C++代码示例
/************************************************************************/
/* 设计模式专题
/*
/* 解释器模式
/*
/* Author : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date : 20180918
/************************************************************************/
#include <iostream>
class Context
{
public:
Context(int num)
{
this->m_num = num;
}
int getNum()
{
return m_num;
}
int getRes()
{
return m_res;
}
void setNum(int num)
{
this->m_num = num;
}
void setRes(int res)
{
this->m_res = res;
}
private:
int m_num;
int m_res;
};
class Expression
{
public:
virtual void interpreter(Context *context) = 0;
};
class PlusExpression : public Expression
{
public:
virtual void interpreter(Context *context)
{
int num = context->getNum();
num ++;
context->setNum(num);
context->setRes(num);
}
};
class MinusExpression : public Expression
{
public:
virtual void interpreter(Context *context)
{
int num = context->getNum();
num -- ;
context->setNum(num);
context->setRes(num);
}
};
void main()
{
Expression *expression = NULL;
Context *context = NULL;
Expression *expression2 = NULL;
context = new Context(10);
printf("%d\n",context->getNum());
expression = new PlusExpression;
expression->interpreter(context);
printf("%d\n",context->getRes());
expression2 = new MinusExpression;
expression2->interpreter(context);
printf("%d\n",context->getRes());
}
python代码示例
# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
#
# 解释器模式
#
# Author : zzl
#
# 编程环境: window10 python2.7
#
# Date : 20180918
##################################################################
class Context(object):
def __init__(self, num):
self.m_num = num
self.m_res = num
def get_num(self):
return self.m_num
def get_res(self):
return self.m_res
class Expression(object):
def interpreter(self, context):
pass
class PlusExpression(Expression):
def interpreter(self, context):
context.m_num = context.m_num + 1
context.m_res = context.m_num
class MinusExpression(Expression):
def interpreter(self, context):
context.m_num = context.m_num - 1
context.m_res = context.m_num
if __name__ == "__main__":
context = Context(10)
print(context.m_num)
expression = PlusExpression()
expression.interpreter(context)
print(context.m_res)
expression2 = MinusExpression()
expression2.interpreter(context)
print(context.m_res)