반응형
Visitor Pattern (방문자 패턴)목적
객체의 속성과 처리(연산)를 분리함으로써 클래스를 수정하지 않고 새로운 연산을 추가할 수 있다.
MVC패턴에서 Model과 View를 나눠 놓은것과 비슷하다.
UML상에서 Element은 Model과 매핑되고 Visitor는 Controller에 매핑된다.
Element에서 Visitor를 accept했을 자기 자신을 Visitor의 visit메소드로 전달 해주는 구조이다.
사용 시나리오
- 변수 a와 b를 가지고 있는 Element가 있다고 가정한다.
- Element의 수정없이 더하기 연산과 곱하기 연산을 추가한다.
[Element]
class Element {
public:
virtual ~Element(){};
virtual void accept(Visitor* visitor) = 0;
};
[ConreteElement]
class DoubleElement : public Element {
public:
DoubleElement(double a, double b) : a(a), b(b) {}
~DoubleElement() {
}
virtual void accept(Visitor* visitor) override {
visitor->visit(this);
}
double getA() {
return a;
}
double getB() {
return b;
}
private:
double a, b;
};
class IntElement : public Element {
public:
IntElement(int a, int b) : a(a), b(b){}
~IntElement() {
}
virtual void accept(Visitor* visitor) override {
visitor->visit(this);
}
int getA() {
return a;
}
int getB() {
return b;
}
private:
int a, b;
};
[Visitor]
class Visitor {
public:
virtual ~Visitor(){};
virtual void visit(DoubleElement* doubleElement) = 0;
virtual void visit(IntElement* intElement) = 0;
};
[ConcreteVisitor]
class AddVisitor : public Visitor {
virtual void visit(DoubleElement* doubleElement) override {
double sum = doubleElement->getA() + doubleElement->getB();
cout<<"AddVisitor double element's result : " << sum <<endl;
}
virtual void visit(IntElement* intElement) override {
int sum = intElement->getA() + intElement->getB();
cout<<"AddVisitor int element's result : " << sum <<endl;
}
};
class MulVisitor : public Visitor {
virtual void visit(DoubleElement* doubleElement) override {
double mul = doubleElement->getA() * doubleElement->getB();
cout<<"MulVisitor double element's result : " << mul <<endl;
}
virtual void visit(IntElement* intElement) override {
int mul = intElement->getA() * intElement->getB();
cout<<"MulVisitor int element's result : " << mul <<endl;
}
};
[Client]
int main(int argc, const char * argv[]) {
DoubleElement* doubleElement = new DoubleElement(3.2,2.3);
IntElement* intElement = new IntElement(1,2);
AddVisitor* addVisitor = new AddVisitor();
MulVisitor* mulVisitor = new MulVisitor();
doubleElement->accept(addVisitor);
intElement->accept(addVisitor);
doubleElement->accept(mulVisitor);
intElement->accept(mulVisitor);
delete doubleElement;
delete intElement;
delete addVisitor;
delete mulVisitor;
return 0;
}
실행결과
AddVisitor double element's result : 5.5
AddVisitor int element's result : 3
MulVisitor double element's result : 7.36
MulVisitor int element's result : 2
반응형
'Design Patterns > Behavioral Patterns' 카테고리의 다른 글
State Pattern (C++) (0) | 2020.01.03 |
---|---|
Memento Pattern (C++) (0) | 2019.12.30 |
Mediator Pattern (C++) (0) | 2019.12.29 |
Command Pattern (C++) (0) | 2019.12.22 |
Chain of Responsibility Pattern (C++) (0) | 2019.12.15 |