gpt4 book ai didi

cocoa - 如何在不给对象太多领域知识的情况下为一个对象拥有多个委托(delegate)?

转载 作者:行者123 更新时间:2023-12-03 18:04:34 26 4
gpt4 key购买 nike

设置:我有一个单例数据访问管理器对象,将其称为管理器。我还有一些 View Controller ,称它们为苹果和橘子。 Apple 和 Orange 都使用 Manager 来实现某些共享数据模型/访问功能。

我希望经理在某些情况下根据如下内容给他们中的任何一个回电:

if (someCondition)
[self.applesDelegate callSomething];
else if (otherCondition)
[self.orangesDelegate callSomething];

我看到了三种实现此目的的方法,但我对其中没有一种感到满意。

1) 完全按照我上面的操作,给 Manager 一些属性,如 applesDelegate 和 OrangesDelegate,并让相关的 View Controller 为此注册自己。但这会很糟糕,因为经理拥有领域知识,而我不想拥有这些知识。经理不应该了解有关 Apple 或 Orange 对象的任何信息。

2) 有一个动态的委托(delegate) map 。经理将为委托(delegate)提供一些 NSMutableDictionary,苹果和橙子会做类似的事情

[manager.delegateMap setObject:self forKey:@"applesDelegate"];

当 Manager 需要调用委托(delegate)时,会执行类似的操作

if (someCondition) {
[[delegatemap objectForKey:@"applesDelegate"] callSomeMethod];
}

这听起来可行但很奇怪。而且我不确定当您没有委托(delegate)属性但有这种间接性时,它将如何满足将委托(delegate)设置为 nil 的常见解除分配要求。

3) 完全放弃委托(delegate)的想法,转而使用通知。经理只需生成通知,苹果和橙子就会听取这些通知。但这会丢失很多编译时检查,这就是为什么我仍在考虑具有更紧密耦合的委托(delegate)。

您会推荐这三个中的哪一个?或者也许有什么不同?

最佳答案

在某些情况下,责任链模式很有用。每个委托(delegate)都能够确定自己是否可以完成该任务。所以就这样了

       if ( ! apple.doItIfYouCan(condition, methodName) )
else ( orange.doItIfYouCan(condition, methodName)

我对这种在委托(delegate)之间分散责任的做法感到非常不舒服。

所以我通常会寻找类似于您的选项 2 的内容。实际上,您正在构建一个调度表。我完全有可能尝试将条件重新转换为可以在表格中查找的内容。所以实际上我们获取一些信息并返回一个对象和一个方法

        whatToDo = lookup(condition definition)

whatToDo[who].what

(抱歉缺少语法,我不会说你们的语言,我希望这些概念能够翻译 - 我可以用 JavaScript、C 中的函数指针或 Java 中的反射来完成此操作。)

关于cocoa - 如何在不给对象太多领域知识的情况下为一个对象拥有多个委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3369140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com