你会说Objective-C类别是visitor design pattern的实现吗?Objective-C类别==访客模式?
4
A
回答
11
不,Objective-C类别不是访客模式的实现。在设计模式世界中,类别实际上并不完全匹配,因为在大多数语言中将方法注入到没有子类的现有类中是不可能的。我想说它更接近decorator pattern,但是这种模式通常是通过合成来实现的,即通过包装要“增强”的对象实例。
访问者模式对于封装可应用于各种对象,结构等的算法逻辑非常有用。例如,如果要为对象图形创建HTML输出,可以(A)编写(B)使用访问者模式并创建一个知道如何为其访问的每个节点生成HTML输出的具体访问者。
前一种方法更通用,任务T的逻辑分散在X,Y和Z类的小块中。后一种方法将所有相关代码放在单个访问者对象中,这往往会简化维护和防止“我忘了一堂课......”的问题。然而,对于简单的情况来说,访问者模式可以说有些过分 - 当它有几个不同的并行功能并且希望从正在执行功能的类中抽象逻辑时,它确实值得回报。例如,您可以实现其他访问者,这些访问者可以产生PDF或RTF输出等。每个访问者可以按照必要的顺序来处理递归并调用其自己的访问方法,并且单独的访问者可以使用完全不同的顺序。
应该指出,在许多语言中,访问者模式使用方法重载(相同名称,不同签名/参数)。由于Objective-C不允许重载方法,因此您必须使用不同的方法名称,但这实际上可以帮助避免因不知道哪个重载被调用而导致的错误。
2
类别可用于实现访问者模式。
@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设计更简洁,因为没有被访问类的公共接口的污染,整个事情可以在访问者类的编译单元进行封装。
相关问题
- 1. 访客设计模式 - 返回类型
- 2. 类型列表访客模式示例
- 3. 访客模式说明
- 4. 访客模式的实施
- 5. 设计师设计模式与访客设计模式的区别
- 6. 使用访客模式检查派生类的类型?
- 7. 模块中的Joomla类别博客
- 8. Drupal 7 - 博客模块 - 类别?
- 9. 访客模式的用途与例子
- 10. 模板和样式位访客
- 11. 访客模式中使用accept()
- 12. 访客设计模式 - 电子商务
- 13. 简单的访客模式故障
- 14. 访客模式+打开/关闭原理
- 15. 访客设计模式与内树
- 16. 访问者模式接受不识别对象的类
- 17. 从ObjectiveC类中引用UIViewController
- 18. 的ObjectiveC,创建类的
- 19. ObjectiveC执行和打字的类别和速度
- 20. 的ObjectiveC类别不进口,但仍运行代码
- 21. 访客设计模式和深度首次搜索之间的区别?
- 22. 将类别转换为另一类别的设计模式
- 23. 访客中的堆栈状态是否会破坏访客模式?
- 24. 数据库模式多个类别
- 25. Java - 识别值类型的模式
- 26. 模式识别
- 27. 识别模式
- 28. 模式识别
- 29. 模式识别
- 30. 类派生 - 访问者模式