320x100
구조
#include <iostream>
#include <string>
#include <queue>
#include <list>
class Context
{
};
class AbstractExpression
{
public:
virtual std::string Interpret(Context context) = 0;
};
class TerminalExpression : public AbstractExpression
{
public:
std::string Interpret(Context context) override
{
return "Terminal Expression";
}
};
class NonTerminalExpression : public AbstractExpression
{
private:
std::list<AbstractExpression*> sub_expressions_;
public:
NonTerminalExpression()
{
}
std::string Interpret(Context context) override
{
std::string str = "Non Terminal Expression\n";
for (auto* sub_expression : sub_expressions_)
{
str += "└ " + sub_expression->Interpret(context) + '\n';
}
return str;
}
void AddSubExpression(AbstractExpression* expression)
{
sub_expressions_.push_back(expression);
}
};
사용
int main()
{
Context context = Context();
NonTerminalExpression expression;
expression.AddSubExpression(new TerminalExpression);
expression.AddSubExpression(new TerminalExpression);
std::cout << expression.Interpret(context);
system("pause");
return 0;
}
여러 객체(TerminalExpression)들을 조합해 문법을 정의할 수 있게 한다.
각각의 객체(TerminalExpression)는 특정한 문법에 대해 처리할 수 있게 만들어지고, 이들이 모여 컴포지트 패턴과 같은 복합적인 트리 구조로 이루어지게 된다.
게임에서는 Behavior Tree가 이와 비슷한 패턴으로 만들어진다.
320x100
'프로그래밍 > GoF' 카테고리의 다른 글
[행동 패턴] - 감시자(Observer) (0) | 2022.01.08 |
---|---|
[행동 패턴] - 메멘토(Memento) (0) | 2022.01.08 |
[행동 패턴] - 반복자(Iterator) (0) | 2022.01.06 |
[행동 패턴] - 명령(Command) (0) | 2022.01.05 |
[행동 패턴] - 책임 연쇄(Chain of responsibility) (0) | 2022.01.05 |