[디자인 모드] 해석 기
5827 단어 디자인 모드
실제 응용 이 많 지 않 을 수 있 으 니 먼저 가 져 와 서 알 아 보 세 요.이해 가 부족 한 게 틀림 없어.그 오묘 함 을 제대로 깨 닫 지 못 했다.
이 모델 은 상하 문, 표현 식, 고객 으로 구성 되 어 있다.표현 식 은 종결 노드 와 비 종결 노드 로 나 뉜 다.이런 구 조 는 자 연 스 럽 게 재 귀 를 생각 할 것 이다.그 러 니까 성능 이 이상 적 이지 않 을 거 야.물론 디자인 모델 쪽 책 에서 도 이 모델 의 응용 장면 은 성능 에 대해 엄격 한 요구 가 없 는 장면 이 라 고 말 했다.
종결 노드 는 이 노드 의 행 위 를 분석 하 는 것 을 책임 집 니 다. 종결 노드 가 아 닌 보통 바 텀 N 개의 종결 노드 나 비 종결 노드 로 구성 되 는데 그 작업 은 바로 이 N 개의 자손 간 에 이 노드 에서 의 행 위 를 설명 하 는 것 입 니 다.
낡은 계산 기 를 가지 고 데 모 를 간단하게 쓰 는 것 이 좋 겠 다.
/***************************************************************************
*
* Copyright (c) 2013 , Inc. All Rights Reserved
*
**************************************************************************/
/**
* @file test_interpreter.cpp
* @author itegel
* @date 2013/05/30 14:09:57
* @brief
*
**/
#include <stdlib.h>
#include <iostream>
#include <map>
#include <string>
#include <stack>
using namespace std;
//father
class Expression{
public:
Expression(){}
~Expression(){}
virtual int Interprete() = 0;
virtual void AboutMe() = 0;
protected:
char _key;
int _val;
};
//terminal Expression
class VarExpression : public Expression{
public:
VarExpression(char key){
_key = key;
}
virtual int Interprete(){
return _key-'0';
}
virtual void AboutMe(){
cout<<"(var:"<<_key<<")";
}
};
//Nonterminal Expression
class SymbolExpression : public Expression{
public:
SymbolExpression(Expression *left, Expression *right){
_left = left;
_right = right;
}
virtual int Interprete() = 0;
virtual void AboutMe() = 0;
protected:
Expression * _left;
Expression * _right;
};
//+
class AddExpression : public SymbolExpression{
public:
AddExpression(Expression *left, Expression *right):SymbolExpression(left,right){}
virtual int Interprete(){
return _left->Interprete() + _right->Interprete();
}
virtual void AboutMe(){
_left->AboutMe();
cout<<"(Sym:+)";
_right->AboutMe();
}
};
//-
class SubExpression : public SymbolExpression{
public:
SubExpression(Expression *left, Expression *right):SymbolExpression(left,right){}
virtual int Interprete(){
return _left->Interprete() - _right->Interprete();
}
virtual void AboutMe(){
_left->AboutMe();
cout<<"(Sym:-)";
_right->AboutMe();
}
};
//calculator 0-9
class Calculator{
public:
Calculator(const char * expr){
_expr_str = expr;
_expression = NULL;
}
~Calculator(){
if (_expression){
delete _expression;
}
}
void BuildExpression(){
Expression * left = NULL;
Expression * right = NULL;
const char * expr_char = _expr_str;
cout<<"Building Expression"<<endl;
for (int i = 0; i < strlen(expr_char); i++){
switch (expr_char[i]){
case '+':
cout<<'+';
left = tmp_stack.top();
right = new VarExpression(expr_char[++i]);
cout<<expr_char[i];
tmp_stack.push(new AddExpression(left, right));
break;
case '-':
cout<<'-';
left = tmp_stack.top();
right = new VarExpression(expr_char[++i]);
cout<<expr_char[i];
tmp_stack.push(new SubExpression(left, right));
break;
default:
cout<<expr_char[i];
tmp_stack.push(new VarExpression(expr_char[i]));
break;
}
}
_expression = tmp_stack.top();
}
Expression * GetExpression(){
return _expression;
}
private:
const char * _expr_str;
Expression * _expression;
stack<Expression *> tmp_stack;
};
int main(){
Calculator * cal = new Calculator("1+2-3+4-1-2");
cal->BuildExpression();
Expression * expr = cal->GetExpression();
cout<<endl<<endl<<"Builded Expression:"<<endl;
expr->AboutMe();
cout<<endl;
int val = expr->Interprete();
cout<<endl<<"Expression Val:"<<val<<endl;
return 0;
}
실행 결과:
Building Expression 1+2-3+4-1-2 Builded Expression: (var:1)(Sym:+)(var:2)(Sym:-)(var:3)(Sym:+)(var:4)(Sym:-)(var:1)(Sym:-)(var:2) Expression Val:1
demo 에서 볼 때 표현 식 의 클래스 구 조 는 비교적 간단 하고 모든 하위 클래스 는 자신의 행동 에 만 관심 을 가 져 야 합 니 다. 후속 확장 은 가장 많 게 는 서로 다른 하위 클래스 만 확장 하여 해당 하 는 작업 을 완성 하면 됩 니 다.
실제로 가장 복잡 한 부분 은 표현 식 트 리 를 만 드 는 과정 일 것 으로 예상 된다.이 예 에서 간단 하기 위해 서 는 가감 법 만 지원 하고 char 를 조작 수로 하기 때문에 한 자리 숫자 만 지원 할 수 있 습 니 다.
해석 기 모드, 장점 은 새로운 조작 을 확장 하 는 것 이 쉽다 는 것 이다.단점 은 모두 성능 이 좋 지 않다 고 말 하지만, 사실 나 도 말 할 수 없다.
개인 적 으로 가장 큰 문 제 는 응용 장면 이 그리 많 지 않 을 수도 있다 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.