Objective-C的类别==访问者模式?
-
20-09-2019 - |
题
你会说,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设计更简洁,因为没有被访问类的公共接口的污染,整个事情可以在访问者类的编译单元进行封装。
不隶属于 StackOverflow