网站制作的重要流程,网站搭建平台都有哪些,运营笔记 wordpress,湖北专业的网瘾戒除学校收费标准“领域规则”模式
在特定领域中#xff0c;某些变化虽然频繁#xff0c;但可以抽象为某种规则。这时候#xff0c;结合特定领域#xff0c;将稳日抽象为语法规则#xff0c;从而给出在该领域下的一般性解决方案。
典型模式#xff1a;Interpreter
动机(Motivation)
在…“领域规则”模式
在特定领域中某些变化虽然频繁但可以抽象为某种规则。这时候结合特定领域将稳日抽象为语法规则从而给出在该领域下的一般性解决方案。
典型模式Interpreter
动机(Motivation)
在软件构建过程中如果某一特定领域的问题比较复杂类似的结构不断重复出现如果使用普通的编程方式实现将面临非常频繁的变化。
在这种情况下将特定领域的问题表达为某种语法规则下的句子然后构建一个解释器来解释这样的句子从而达到解决问题的目的。
模式定义
给定一个语言定义它的文法的一种表示并定义一种解释器这个解释器使用该表示来解释语言中的句子。
示例:
#include iostream
#include map
#include stackusing namespace std;class Expression {
public:virtual int interpreter(mapchar, int var) 0;virtual ~Expression() {}
};//变量表达式
class VarExpression : public Expression {char key;
public:VarExpression(const char key) {this-key key;}int interpreter(mapchar, int var) {return var[key];}
};//符号表达式
class SymbolExpression : public Expression {//运算符左右两个参数
protected:Expression* left;Expression* right;public:SymbolExpression(Expression* left, Expression* right) {this-left left;this-right right;}
};//加法运行
class AddExpression : public SymbolExpression {
public:AddExpression(Expression* left, Expression* right): SymbolExpression(left, right){}int interpreter(mapchar, int var) {return left-interpreter(var) right-interpreter(var);}
};//减法运行
class SubExpression : public SymbolExpression {
public:SubExpression(Expression* left, Expression* right): SymbolExpression(left, right){}int interpreter(mapchar, int var) {return left-interpreter(var)- right-interpreter(var);}
};Expression* analyse(string expStr) {stackExpression* expStack;Expression* left;Expression* right;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]));break;}}return expStack.top();
}void release(Expression* expression) {// 释放表达式树的节点内存
}int main() {string expStr ab-cd;mapchar, int var;var.insert(make_pair(a, 5));var.insert(make_pair(b, 2));var.insert(make_pair(c, 1));var.insert(make_pair(d, 6));Expression* expression analyse(expStr);int result expression-interpreter(var);cout result endl;release(expression);return 0;
} 要点总结
Interpreter模式的应用场合式Interpreter模式的应用中的难点只有满足“业务规则频繁变化且类似的结构不断重复出现并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
使用Interpreter模式来表达文法规则从而可以使用面向对象技巧来方便地“扩展”文法。
Interpreter模式比较适合简单的文法表示对于复杂的文法表示Interperter模式会产生比较大的类层次结构需要求助于语法分析生成器这样的标准工具。