你认为Objective-C分类是访问者设计模式的一种实现吗?
htmlString
方法并为每个对象调用它,或者(B)使用访问者模式并创建一个具体的访问者,该访问者知道如何为其访问的每个节点生成HTML输出。需要注意的是,在许多编程语言中,访问者模式使用方法重载(相同名称,不同签名/参数)。由于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 访问者模式更加简洁,因为它不会污染被访问类的公共接口,而且整个过程可以封装在访问者类的编译单元中。