我正在为我的一个对象使用委托模式。我的想法是,我将能够稍后交换代表,以实现不同的策略。我认为这与委托模式一样具有策略模式。
我的问题是,对于我的委托来说,对它作为委托的对象有一个引用是不好的做法?无论我使用哪个委托/策略,我都需要访问该对象的一些属性。如果这是不好的形式,我应该如何访问属性?
答案 0 :(得分:9)
不一定。例如,“控制器”类型对象创建数据对象和视图并使其自身成为某些对象的委托以便正确控制事物是很常见的。
答案 1 :(得分:3)
这一点都不是不好的做法。委托模式允许类具有与任意数量的对象进行通信的通用方式,只要实现相同的协议即可。但是,您设置委托的类通常也会有许多公共属性或方法,允许您查询或更改类正在执行的操作,以响应类可以依次触发多个委托调用。所以你需要一个你所代表的类的引用,以告诉对象做一些与已经不同的事情,当然也可以在你完成时发布它!
这也是为什么始终将任何委托属性作为赋值而不是保留属性的重要性。这样,当原始类被释放时,它实际上将被释放,而不是让它持有的委托对象导致一个保留循环,保持两者。
这也是为什么每当你被释放时,你应该在你可能拥有委托引用集的任何东西中将委托引用设置为nil。这样,如果在使用委托的类之前释放委托,则类将不具有无效的委托引用。
答案 2 :(得分:2)
通常,依赖项不应该有依赖对象的引用,因为这将是一个经典的圆引用。要避免使用反向引用,可以在委托方法中提供所需的属性作为参数,或者将属性本身移动到委托中。
答案 3 :(得分:-1)
我会说是的,这是不好的做法。委托背后的想法是它实际上是一个独立的对象,它接收有关它作为委托的对象的消息(“委托者”)。委托人应该引用代表,而不是相反,否则它不再是真正的委托关系。
完成所要求的首选方法是提供发送对象以及您的代理接收的任何消息。例如,在您的委托上,您可以删除delegator
属性并发送消息{{1},而不是拥有didDoSomething:(id)anObject
属性,然后接收delegator
方法。 }。这样,您可以使委托与委托者保持不同,但仍然可以在需要时访问委托者的属性。
这种方式还有一个好处,就是当你不真正需要时,不能在方法中提供对委托者的访问;例如,您的委托可以有一个不带参数的delegator:(id)anObject didDoSomething:(id)anotherObject
方法,甚至不是委托者,只用于记录,以及调用委托者的某些属性的didDoSomething
方法,更多参与。
最后,此方法允许您为多个委托者使用相同的委托,因为您不需要为每个委托对象更新delegator:(id)anObject didSomethingElse:(id)anotherObject
属性。
有关其工作原理的一个很好的示例,请查看NSURLConnection文档,特别是其委托方法 - 其中很多采用delegator
形式,其中第一个参数是连接调用委托人。开发人员通常为多个连接定义单个连接委托,根据传入的NSURLConnection对象的属性,实现其委托方法以执行不同的操作。