Objective-C 类别 == 访问者模式?

标签 objective-c categories visitor-pattern

您认为 Objective-C 类别是 visitor design pattern 的实现吗? ?

最佳答案

不,Objective-C 类别不是访问者模式的实现。类别在设计模式世界中并没有真正的精确匹配,因为在大多数语言中不可能将方法注入(inject)没有子类的现有类的技术。我会说它更接近 decorator pattern ,但该模式通常是通过组合实现的,即通过包装您想要“增强”的对象的实例。

访问者模式对于封装可应用于各种对象、结构等的算法逻辑很有用。例如,如果您想为对象图创建 HTML 输出,您可以 (A) 编写 htmlString每个对象上的方法并为每个对象调用它,或者 (B) 使用访问者模式并创建一个具体的访问者,该访问者知道如何为它访问的每个节点生成 HTML 输出。

前一种方法更通用,任务 T 的逻辑分散在 X、Y 和 Z 类中的小块中。后一种方法将所有相关代码放在单个访问者对象中,这往往简化维护并防止“我忘了那一节课……”的问题。然而,对于简单的情况,访问者模式可以说有点笨拙——当你有几个不同的并行功能并希望从执行这些功能的类中抽象出逻辑时,它真正有用的地方。例如,您可以实现其他生成 PDF 或 RTF 输出的访问者等。每个访问者都可以按照必要的顺序处理递归和调用自己的访问方法,并且单独的访问者可以使用完全不同的顺序。

应该注意的是,在许多语言中,访问者模式使用方法重载(相同的名称,不同的签名/参数)。由于 Objective-C 不允许方法重载,因此您必须使用不同的方法名称,但这实际上有助于避免因不知道调用了哪个重载而导致的错误。

关于Objective-C 类别 == 访问者模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1334731/

相关文章:

WordPress SLUGS : Override categories with pages?

c# - 参数类型不匹配 Transforming anonymous Expression<Func<T,U>> to non anonymous Expression<Func<T,U>>

php - 仅显示 Woocommerce 子产品类别

ruby - Rails3 Arel 访问自定义类

c++ - 使用 lambda 进行变体访问的最佳方法

ios - UIToolbar - 允许在工具栏下方进行交互

ios - 在完整 View 中重新排序 subview

objective-c - 如何创建一个 NSPredicate 来过滤给定范围内的所有字符,包括数字/数字?

iphone - 来自 AppDelegate 的 PresentViewController

php - 在 Woocommerce 电子邮件通知中隐藏特定产品类别的价格项目