你会说,Objective-C的类别是访问者设计模式

有帮助吗?

解决方案

没有,Objective-C的类别并不访问者模式的实现。分类真的没有在设计模式世界完全匹配的,因为注射的方法将现有类没有子类的技术,大多数语言是不可能的。我会说这是更接近装饰图案,但该模式通常与组成,即实施通过包装要“增强”的对象。

的一个实例

在访问者模式是用于封装可被应用到各种不同的物体,结构,等。例如算法逻辑有用,如果要创建HTML输出对象的图表,可以(A)写信htmlString每个对象上的方法并调用它为每个对象,或(B)使用访问者模式,并创建知道如何产生HTML输出它所访问的每个节点的具体访问者。

前一种方法是更通用的,并且为任务T中的逻辑被跨类X散在小的块,Y和Z的后一种方法将所有相关的代码在单个访问者对象,这趋向于简化维护和防止在“我忘了一类......”的问题。然而,访问者模式可以说是有点重手进行简单的情况 - 它是值得的是,当你有几个不同的并行功能,并希望从抽象上正在执行的功能的类的逻辑。例如,您可能会实现其生成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

这是IMO比经典的GoF Visitor设计更简洁,因为没有被访问类的公共接口的污染,整个事情可以在访问者类的编译单元进行封装。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top