【问题标题】:Relative Advantages of creating custom protocol & delegate in objective -c在objective -c中创建自定义协议和委托的相对优势
【发布时间】:2011-09-15 14:13:33
【问题描述】:

我想知道与其他实现双向类通信的技术相比,使用自定义协议和委托的相对优势是什么?

例如,另一种解决方案是:

A 关联到 B B 关联到 A

这样 A 和 B 都可以访问彼此的信息...

我有点理解协议允许增加系统设计的模块化,但我不完全确定为什么或如何?

【问题讨论】:

    标签: iphone objective-c delegates protocols


    【解决方案1】:

    自定义委托协议是一件很棒的事情,它允许您的对象不依赖于特定的类。任何符合给定协议的对象都可以是委托。例如,任何实现 NSTableViewDelegate 协议的对象都可以成为表视图的委托。

    否则,如果使用直接关联,则必须使用某个类的对象。

    【讨论】:

      【解决方案2】:

      使用委托模式(特别是使用协议),类保持松散耦合。这在考虑 MVC 模式时很重要。委托模式允许视图与控制器保持分离。

      此外,“A 关联到 B B 关联到 A”会创建一个保留周期。委托模式编码了内存管理问题(即一个类不应该保留它的委托)。

      【讨论】:

        【解决方案3】:

        这种双向依赖是要避免的,因为在编译级别这意味着您每个包含都包含其他的。

        当 OO 编程的目标之一是减少组件耦合时,您将类捆绑得太多了。

        即使你能做到并不意味着它是好的做法。

        最好的做法是指定 2 种协议,一种用于服务器/对象/生产者/...,另一种用于客户端/委托/消费者/...

        然后 A 将实现一个协议,将与实现第二个协议的对象对话。 B 将实现第二个协议。

        这意味着您可以在将来替换 B 实现以匹配新的 API/编程模型/测试存根等。

        减少耦合是提高代码模块化和可测试性的一种手段。

        您不必这样做,但从现在起 6 个月后重新使用您的代码时,您会很高兴 :)

        【讨论】:

          【解决方案4】:

          通常不需要 2 个对象进行完全双向通信。
          通常在 iPhone 中,您从 A 启动 B(例如,来自列表视图控制器的详细视图控制器)并将 A 设置为 B 的委托,以便它会收到相关事件的直接通知。

          就面向对象的设计/编程而言,以完全双向连接方式连接 2 个对象是不正确的。
          在这种情况下,您松开了封装。

          一旦您使用委托设计模式,您的对象就不会真正了解彼此,但仍然可以通信。
          此外,这样任何实现了某种协议的对象都可以被设置为委托。

          这样对象也不必相互保留...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多