>백엔드 개발 >C#.Net 튜토리얼 >C++ 디자인 패턴의 방문자 패턴에 대한 간략한 소개

C++ 디자인 패턴의 방문자 패턴에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-17 13:24:241565검색

방문자 모드(Visitor): 객체 구조의 각 요소에 대해 수행되는 작업을 나타냅니다. 이를 통해 각 요소의 클래스를 변경하지 않고도 이러한 요소에 대해 수행되는 새 작업을 정의할 수 있습니다.

5가지 역할 클래스:

방문자: 객체 구조에 있는 ConcreteElement의 각 클래스에 대한 방문 작업을 선언합니다.

ConcreteVistor: 방문자가 선언한 각 작업을 구현하는 특정 방문자입니다. 각 작업은 알고리즘의 일부를 구현하며, 알고리즘 조각은 구조의 개체에 해당하는 클래스입니다.

ELement는 방문자를 매개변수로 사용하는 Accept 작업을 정의합니다.

ConcreteElement 특정 요소는 Accept 작업을 구현합니다.

ObjectStructure는 해당 요소를 열거하고 방문자가 해당 요소에 액세스할 수 있도록 높은 수준의 인터페이스를 제공할 수 있습니다.

적용 가능한 경우:

은 비교적 안정적인 데이터 구조를 가진 시스템에 적합합니다. 이는 데이터 구조와 데이터 구조에 작용하는 작업 간의 결합을 분리하여 작업 집합이 비교적 자유롭게 진화할 수 있습니다.

방문자 패턴의 목적은 데이터 구조에서 처리를 분리하는 것입니다. 많은 시스템이 알고리즘과 데이터 구조에 따라 분리될 수 있는데, 이러한 시스템이 상대적으로 안정적인 데이터 구조를 갖고 있고, 알고리즘이 변경하기 쉬운 경우에는 방문자 모드를 사용하는 것이 더 적합합니다. 방문자 모드를 사용하면 증가하기 쉽기 때문입니다. 알고리즘 연산의 수.

장점:

방문자 모드의 장점은 새 작업을 추가한다는 것은 새로운 방문자를 추가한다는 의미이므로 새 작업을 추가하기 쉽다는 것입니다. 방문자 패턴은 관련 행동을 방문자 개체에 집중시킵니다.

단점:

새로운 데이터 구조를 추가하기가 어렵습니다.

패턴 구현:

[code]class ConcreteElementA;
class ConcreteElementB;

class Visitor
{
public:
     virtual void VisitConcreteElementA(ConcreteElementA *pElementA) = 0;
     virtual void VisitConcreteElementB(ConcreteElementB *pElementB) = 0;
};

class ConcreteVisitor1 : public Visitor
{
public:
     void VisitConcreteElementA(ConcreteElementA *pElementA);
     void VisitConcreteElementB(ConcreteElementB *pElementB);
};

void ConcreteVisitor1::VisitConcreteElementA(ConcreteElementA *pElementA)
{
     // 现在根据传进来的pElementA,可以对ConcreteElementA中的element进行操作
}

void ConcreteVisitor1::VisitConcreteElementB(ConcreteElementB *pElementB)
{
     // 现在根据传进来的pElementB,可以对ConcreteElementB中的element进行操作
}

class ConcreteVisitor2 : public Visitor
{
public:
     void VisitConcreteElementA(ConcreteElementA *pElementA);
     void VisitConcreteElementB(ConcreteElementB *pElementB);
};

void ConcreteVisitor2::VisitConcreteElementA(ConcreteElementA *pElementA)
{
     // ...
}

void ConcreteVisitor2::VisitConcreteElementB(ConcreteElementB *pElementB)
{
     // ...
}

// Element object
class Element
{
public:
     virtual void Accept(Visitor *pVisitor) = 0;
};

class ConcreteElementA : public Element
{
public:
     void Accept(Visitor *pVisitor);
};

void ConcreteElementA::Accept(Visitor *pVisitor)
{
     pVisitor->VisitConcreteElementA(this);
}

class ConcreteElementB : public Element
{
public:
     void Accept(Visitor *pVisitor);
};

void ConcreteElementB::Accept(Visitor *pVisitor)
{
     pVisitor->VisitConcreteElementB(this);
}

// ObjectStructure类,能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素
class ObjectStructure
{
public:
     void Attach(Element *pElement);
     void Detach(Element *pElement);
     void Accept(Visitor *pVisitor);

private:
     vector<Element *> elements;
};

void ObjectStructure::Attach(Element *pElement)
{
     elements.push_back(pElement);
}

void ObjectStructure::Detach(Element *pElement)
{
     vector<Element *>::iterator it = find(elements.begin(), elements.end(), pElement);
     if (it != elements.end())
     {
          elements.erase(it);
     }
}

void ObjectStructure::Accept(Visitor *pVisitor)
{
     // 为每一个element设置visitor,进行对应的操作
     for (vector<Element *>::const_iterator it = elements.begin(); it != elements.end(); ++it)
     {
          (*it)->Accept(pVisitor);
     }
}

테스트 케이스:

[code]int main()
{
     ObjectStructure *pObject = new ObjectStructure;

     ConcreteElementA *pElementA = new ConcreteElementA;
     ConcreteElementB *pElementB = new ConcreteElementB;

     pObject->Attach(pElementA);
     pObject->Attach(pElementB);

     ConcreteVisitor1 *pVisitor1 = new ConcreteVisitor1;
     ConcreteVisitor2 *pVisitor2 = new ConcreteVisitor2;

     pObject->Accept(pVisitor1);
     pObject->Accept(pVisitor2);

     if (pVisitor2) delete pVisitor2;
     if (pVisitor1) delete pVisitor1;
     if (pElementB) delete pElementB;
     if (pElementA) delete pElementA;
     if (pObject) delete pObject;

     return 0;
}

위는 방문자 패턴에 대한 C++ 디자인 패턴 간략 소개 내용입니다. PHP 중국어 웹사이트(www.php.cn)에 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.