문제

Objective-C 범주가 방문자 디자인 패턴?

도움이 되었습니까?

해결책

아니요, 대상 C 범주는 방문자 패턴의 구현이 아닙니다. 대부분의 언어에서는 서브 클래스가없는 기존 클래스에 메소드를 주입하는 기술이 불가능하기 때문에 카테고리는 디자인 패턴 세계에서 정확히 일치하지 않습니다. 나는 그것이 더 가깝다고 말하고 싶습니다 데코레이터 패턴, 그러나 그 패턴은 일반적으로 구성으로 구현됩니다. 즉, "향상"하려는 객체의 인스턴스를 감싸서.

방문자 패턴은 다양한 객체, 스트러크 등에 적용될 수있는 알고리즘 로직을 캡슐화하는 데 유용합니다. 예를 들어, 객체 그래프에 대한 HTML 출력을 만들려면 (a) 쓸 수 있습니다. htmlString 각 객체에 메소드를 호출하고 각 객체에 대해 호출하거나 (b) 방문자 패턴을 사용하고 방문하는 각 노드에 대해 HTML 출력을 생성하는 방법을 알고있는 콘크리트 방문자를 만듭니다.

전자의 접근 방식은 더 일반적이며 작업 T에 대한 논리는 클래스 X, Y 및 Z에 걸쳐 작은 청크에 흩어져 있습니다. 후자의 접근법은 모든 관련 코드를 단일 방문자 객체에 배치하여 유지 보수를 단순화하고 "I를 방지하는 경향이 있습니다. 그 한 수업을 잊어 버렸습니다 ... "문제. 그러나 방문자 패턴은 간단한 상황에 대해 다소 무겁습니다. 실제로 지불하는 것은 여러 가지 병렬 기능이 있고 기능이 수행되는 클래스에서 논리를 추상화하고자하는 경우입니다. 예를 들어, PDF 또는 RTF 출력 등을 생성하는 다른 방문자를 구현할 수 있습니다. 각 방문자는 재귀를 관리하고 필요한 순서대로 자체 방문 방법을 호출 할 수 있으며 별도의 방문자는 완전히 별개의 주문을 사용할 수 있습니다.

많은 언어에서 방문자 패턴은 메소드 과부하 (동일한 이름, 다른 서명/인수)를 사용합니다. Objective-C는 메소드 과부하를 허용하지 않으므로 고유 한 메소드 이름을 사용해야하지만 실제로 오버로드가 호출되는지 알지 못해 버그를 피할 수 있습니다.

다른 팁

카테고리는 방문자 패턴을 구현하는 데 사용될 수 있습니다.

@protocol Visit
- (void)acceptVisitor:(MyVisitor *)visitor;
@end

@interface Foo (Visit) <Visit>
@end

@interface Bar (Visit) <Visit>
@end

@implementation MyVisitor

- (void)visit:(id)someObject {
    if ([someObject conformsToProtocol:@protocol(Visit)]) {
        [(id<Visit>)someObject acceptVisitor:self];
    }
}

- (void)visitFoo:(Foo *)foo { ... }

- (void)visitBar:(Bar *)bar { ... }

@end

@implementation Foo (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
    [visitor visitFoo:self];
} 
@end

@implementation Bar (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
    [visitor visitBar:Self];
}
@end

방문한 클래스의 공개 인터페이스의 오염이없고 방문자 클래스의 편집 장치에 모든 것이 캡슐화 될 수 있기 때문에 이것은 클래식 GOF 방문자 디자인보다 IMO 네이터입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top