프로그래밍/GoF

[행동 패턴] - 방문자(Visitor)

MAKGA 2022. 1. 9. 12:14
320x100

구조

#pragma once

#include <iostream>

class IVisitor;

class BaseClass
{
public:
    virtual void accept(IVisitor* visitor) = 0;
};

class DerivedClassA : public BaseClass
{
public:
    void accept(IVisitor* visitor) override
    {
        visitor->visitElementA(this);
    }

    void operationA()
    {
        std::cout << "DerivedClassA" << std::endl;
    }
};

class DerivedClassB : public BaseClass
{
public:
    void accept(IVisitor* visitor) override
    {
        visitor->visitElementB(this);
    }

    void operationB()
    {
        std::cout << "DerivedClassB" << std::endl;
    }
};

class IVisitor
{
public:
    virtual void visitDerivedClassA(DerivedClassA* element) = 0;
    virtual void visitDerivedClassB(DerivedClassB* element) = 0;
};

class Visitor : public IVisitor
{
    void visitDerivedClassA(DerivedClassA* element) override
    {
        element->operationA();
    }

    void visitDerivedClassB(DerivedClassB* element) override
    {
        element->operationB();
    }
};

 

사용

int main()
{
    Visitor* visitor = new Visitor;
    DerivedClassA* classA = new DerivedClassA;
    DerivedClassB* classB = new DerivedClassB;

    classA->accept(visitor);
    classB->accept(visitor);

    system("pause");

    return 0;
}

 

객체(DerivedClass)에 대한 알고리즘(accept function)을 객체의 구조로부터 분리하여 방문자 객체(Visitor)에 구현하는 패턴이다. 방문자 패턴에서 객체는 방문자 객체에 '방문하여' 객체 구조에 대한 알고리즘을 수행할 수 있게 된다. 객체가 자신에 대한 방문자 객체의 약속된 메소드를 호출하기만 하면, 방문자 객체는 객체 구조에 대한 구체적인 처리를 대행하는 것이다.

방문자 패턴을 사용한다면 객체 구조 밖에서 알고리즘이 구현되어 객체 구조를 수정하지 않고도 실질적으로 새로운 알고리즘을 추가할 수 있고, 방문자 객체를 통해 객체 구조에 크게 관련되지 않는 기능을 한 곳에서 수행할 수 있어 객체 구조에 대한 캡슐화를 유지할 수 있다.

 

요약: 만물상(Visitor)을 가지고 정해진 주문서(derivedClass)로 실행한다.

320x100