2012-11-28 3 views
10

두 패턴을 모두 배웠지 만이 두 패턴의 차이를 이해하지 못했습니다.방문자와 전략 패턴의 차이점은 무엇입니까?

시나리오를 언제, 어디서 사용할 것인지 잘 모릅니다.

차이점과 사례를 설명 할 수 있습니까?

+3

다른 패턴과 관련된 좋은 방법입니다. http://www.cours.polymtl.ca/inf3700/divers/nonSoftwareExample/patexamples.html –

+0

좋은 링크 @ jco.owens! –

+0

링크가 깨졌습니다. @ jco.owens를 업데이트 할 수 있습니까? – Joe

답변

3

Visitor 패턴은 개체 계층 구조를 가로 지르고 인쇄 또는보고 등과 같은 일부 기능을 제공하는 데 사용됩니다. 여러 형식 (텍스트/HTML)을 제공하여 각 형식에 대해 하나씩 여러 방문자를 작성하여 개체 계층 구조를 인쇄했습니다. . 계층 구조의 객체는 방문 가능 객체입니다.

전략 패턴은 입력을 기반으로 특정 논리 경로를 선택하는 데 사용됩니다. 일반적인 예는 Authorization HTTP 헤더의 값을 기반으로 NTLM/협상/기본과 같은 다양한 인증 전략을 선택하여 실행하는 인증 필터입니다. 필터는 들어오는 요청을 기반으로 AuthenticationStrategy 인터페이스에 대한 참조를 보유하고 특정 인증 전략을 선택하여이 참조에 할당하며 뒤 따르는 코드는 사용되는 정확한 전략을 알 필요가 없습니다.

+1

전략 패턴의 간단한 예 - 목록을 다르게 정렬하기 위해 Comparator의 다른 구현을 사용 하시겠습니까? – Scorpion

15

주요 차이점은 Visitor 패턴 여러 그러한 그룹을 캡슐화 동안 Strategy 패턴은 관련 동작의 단일 그룹을 캡슐화한다는 것이다. 당신이 알고리즘의 가족이 있고 실행시에 그 (것)들의 사이에서 선택해야하는 경우, 당신은 전략 패턴을 사용한다 - 당신이 행동를 캡슐화 할 때

  • 당신은 전략 패턴를 사용해야합니다. 이것은 매우 일반적입니다 : 당신이 program to an interface 때마다 발생합니다.
  • 당신은 이중 파견을 구현하기 위해 방문자 패턴를 사용한다 - 두 개 이상의 오브젝트에 관련 가상 할 필요가 알고리즘 그룹이있는 경우. 이것은 구현하기가 훨씬 더 어렵 기 때문에 부분적으로 보편적이지 않습니다.
+2

+1, 예제를 통해 세부 정보를 얻을 수 있지만 간결한 답변이 좋습니다. – Scorpion

+0

@ dasblinkenlight "둘 이상의 객체와 관련하여 가상으로 있어야하는 알고리즘 그룹이있는 경우"의 의미를 자세히 설명 할 수 있습니까? – Geek

+0

@ Geek 고전적인 예는 표현 트리입니다. 한편으로는 복합 패턴 (기본 표현식, 상수 표현식, 2 진 표현식, 함수 호출 등)을 따르는 클래스 그룹이 있습니다. 반면에 알고리즘을 구현하는 클래스 그룹이 있습니다 (XML로 변환, 텍스트 파일, 평가 등) 따라서 호출하려는 메서드는 표현식의 하위 유형 ** 및 ** 알고리즘의 하위 유형에 따라 달라 지므로 두 개 이상의 클래스와 관련하여 동작이 가상입니다. 공식 이름은 [* double dispatch *] (http://en.wikipedia.org/wiki/Double_dispatch)입니다. – dasblinkenlight

2

Visitor 패턴 의도 :

이 동작을 나타내는 객체 구조의 요소에 대해 수행된다. Visitor를 사용하면 조작중인 요소의 클래스를 변경하지 않고 새 조작을 정의 할 수 있습니다.

사용 Visitor 패턴 경우 :

  • 당신은 많은 독특하고 관련이없는 작업을 실행해야

    1. 비슷한 작업을하는 구조로 그룹화 서로 다른 유형의 객체에을 수행해야 .
    2. 새로운 작업
    3. 기능을 추가 변경하거나 유도하는 수업이 아니라 힘보다 하나의 클래스에 관련된 작업을 수집 객체 구조의 변화없이 을 추가 할 수있는 개체 구조에서 작업을 분리 당신이 중 하나의 소스를 가지고 있지 않거나 소스

    비록를 변경할 수있는 클래스 라이브러리에 방문자 팻 tern은 Object의 기존 코드를 변경하지 않고 새로운 작업을 추가 할 수있는 유연성을 제공하므로 이러한 유연성에는 단점이 있습니다.

    새로운 Visitable 객체가 추가 된 경우 방문자 & ConcreteVisitor 클래스의 코드를 변경해야합니다. 이 문제를 해결할 수있는 해결 방법이 있습니다. 성능에 영향을 줄 수있는 리플렉션을 사용하십시오.

    은 자세한 내용은 oodesign articlesourcemaking 기사

    전략 패턴의 의도를 참조하십시오

    는 각각을 캡슐화, 알고리즘의 가족을 정의하고이를 교환합니다. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 알고리즘을 독립적으로 변경할 수 있습니다.

    전략을 사용하면 개체의 배짱을 변경할 수 있습니다.

    자세한 내용은 SE 질문은 아래를 참조하십시오 : 위에서 언급 한 행동의 차이뿐만 아니라

    Real World Example of the Strategy Pattern

  • 0

    , 나는 또한 의존성에 대한 차이를 경험하고 내가 작업 한 후에는 프로젝트 기간 동안 사용 사례 , 다음과 같이.

    예를 들어 방문자는 구체적인 수업을 알고 있습니다. 따라서 새로운 구체적인 클래스를 계층에 추가 할 때 방문자 코드를 변경하는 대신 유연하게 작업 할 수 있습니다. 전략에는 그런 것이 없습니다. 컨텍스트에 관계없이 주어진 입력으로 일부 출력 만 반환하는 메서드를 사용하면 전략이 더욱 적합 해집니다.

    또한 방문자 패턴은 SOLID의 SRP를 구현하는 데 사용되어 관심사를 구분합니다.

    0

    방문자 당신이 클래스의 가족이있을 때입니다 당신이 그 가족의 모든 클래스에 새로운 기능을 추가 할 수 있지만 클래스 자체를 터치 (또는 새로운 기능을 한 곳에서 정의 된 것을 얻고 자하는 필요 - 방문자)

    전략은 제대로 작동하려면 (예 : 포함 된 일부 개체 정렬) 무언가를 할 수 있어야하지만, 클라이언트 또는 의존성 주입을 원하는 클래스 패밀리가있는 경우 적합합니다. 그 일을하는 방법에 대해 그들에게 말해주십시오.

    관련 문제