代码之家  ›  专栏  ›  技术社区  ›  Jaanus

如何在不给对象太多领域知识的情况下为一个对象指定多个代理?

  •  0
  • Jaanus  · 技术社区  · 14 年前

    设置:我有一个单例数据访问管理器对象,称之为管理器。我也有一些视图控制器,称之为苹果和橙子。apple和Oranges都使用Manager来实现一些共享数据模型/访问功能。

    在某些情况下,我想让经理打电话给他们中的任何一个:

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

    我看到了三种实现这一点的方法,但我都不满意。

    2) 有一个动态代理图。经理会为代表们准备一些NSMutableDictionary,苹果和橙子会像这样做

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

    当经理需要召集代表时,他会这样做

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

    这听起来可行,但很奇怪。我也不知道当你没有委托属性,但是有这种间接性的时候,如何处理将委托设置为nil的常见dealloc要求。

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

    这三个你推荐哪一个?或者是别的什么?

    1 回复  |  直到 14 年前
        1
  •  1
  •   djna    14 年前

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

    我很少对这种责任在代表中的分散感到舒服。

    所以我通常会找一些像你的选择2。实际上,您正在构建一个调度表。我尽可能地把这些条件改写成可以在表格中查找的内容。所以实际上我们获取了一些信息,并得到了一个对象和一个方法

            whatToDo = lookup(condition definition)
    
            whatToDo[who].what
    

    (很抱歉没有语法,我不会说你的语言,我希望这些概念可以翻译-我可以用JavaScript,或者用C的函数指针,或者用Java的反射来完成。)