2016년 10월 23일 일요일

Interpreter Pattern (해석자 패턴)

의도
  • 사용자가 표현하기 쉬운 표현을 사용하게 하고 이를 해석하는 개체를 통해 약속된 알고리즘을 수행하는 패턴
이럴 때 사용하자.
  • 해석이 필요한 언어가 존재하거나 추상 구문 트리로서 그 언어의 문장을 표현하고자 할 때
장점은?
  • 문법의 변경과 확장이 쉬움
  • 문법의 구현이 용이
  • 표현식을 해석하는 새로운 방법을 추가 할 수 있음
단점은?
  • 복잡한 문법은 관리하기 어려움
코드
Context 클래스
class Context
{
public:
   Context(string str) : m_str(str) {};
   const char* GetStr()  { return m_str.c_str(); };
private:
   string m_str;
};

AbstractExpression 클래스
class AbstractExpression
{
public:
   virtual void Interpret(Context* pContext) = 0;
};

TerminalExpression, NonterminalExpression 클래스
class TerminalExpression : public AbstractExpression
{
public:
   void Interpret(Context* pContext) {
      cout << "TerminalExpression: " << pContext->GetStr() << endl;
   };
};

class NonterminalExpression : public AbstractExpression
{
public:
   void Interpret(Context* pContext) {
      cout << "NonterminalExpression: " << pContext->GetStr() << endl;
   };
};

실행부분
void main()
{
   auto_ptr<Context> pContext(new Context("Context"));

   auto_ptr<AbstractExpression> pTerminal(new TerminalExpression());
   pTerminal->Interpret(pContext.get());

   auto_ptr<AbstractExpression> pNonterminal(new NonterminalExpression());
   pNonterminal->Interpret(pContext.get());
}

UML - class 다이어그램

참고
  • GoF의 디자인 패턴(개정판) 재사용성을 지닌 객체지향 소프트웨어의 핵심요소
  • http://horajjan.blog.me/220330464407
  • http://seungdols.tistory.com/entry/GoF%EC%9D%98-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%ED%96%89%EB%8F%99-%ED%8C%A8%ED%84%B4
  • http://copynull.tistory.com/147

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.