8

这是一个非常笼统的问题,但我今天想知道代表。在这一点上,我真的没有具体的时间使用它们或不使用它们——除了明显的情况,比如从选择器或表格视图中传递选择。例如,如果我可以传递对对象的引用并使用它来调用方法,那么是否有理由实现委托?总之,委托模式打算用于什么,什么时候不使用它更好?

感谢您提供快速而全面的答案!他们都非常有帮助。

4

3 回答 3

5

委托模式的优点是委托对象与其委托之间的松散耦合。松耦合提高了类在其他上下文中的可重用性。

委托对象不必知道它与之通信的对象的任何信息(除了它实现委托协议的要求)——尤其是它的类或它有什么方法。如果您以后想在不同的上下文中重用您的组件或让它与不同类的另一个对象通信,那么这个对象所要做的就是实现委托协议。委托对象根本不需要更改。

当然,这也有一个缺点,那就是需要更多的代码,而你编写的代码不是那么明确,因此可能更难理解。这种(通常很小的)折衷是否值得取决于您的用例。如果这两个对象无论如何都是紧密耦合的,并且将来重用的可能性很低,那么使用委托模式可能会过大。

于 2012-07-02T13:33:05.720 回答
3

看到这个讨论

委托允许一个对象在事件发生时向另一个对象发送消息。

优点

  • 非常严格的语法。所有要听到的事件都在委托协议中明确定义。

  • 如果方法未按委托实现,则编译时警告/错误。

  • 仅在控制器范围内定义的协议。

  • 非常可追溯且易于识别应用程序中的控制流。

  • 能够让多个协议定义一个控制器,每个控制器都有不同的代表。

  • 无需第三方对象来维护/监控通信过程。

  • 能够从调用的协议方法接收返回值。这意味着委托可以帮助将信息提供回控制器。

缺点

  • 需要多行代码来定义:1. 协议定义,2. 控制器中的委托属性,以及 3. 委托本身内委托方法定义的实现。

  • 需要注意在对象释放时正确地将委托设置为 nil,否则可能会通过调用释放对象的方法导致内存崩溃。

  • 尽管有可能,但这可能很困难,并且该模式并不真正适合在控制器中拥有同一协议的多个委托(告诉多个对象有关同一事件)

于 2012-07-02T13:31:05.633 回答
2

委托的“用例”与继承几乎相同,即以多态方式扩展类行为。

这是维基百科定义委托的方式:

在软件工程中,委托模式是面向对象编程中的一种设计模式,其中对象不执行其声明的任务之一,而是将该任务委托给关联的帮助对象。有一种责任倒置,其中帮助对象(称为委托)被赋予为委托人执行任务的责任。委托模式是构成其他软件模式(例如组合(也称为聚合)、混合和方面)基础的基本抽象模式之一。

很明显,委托和继承之间有很多区别,但最大的区别是,IMO,继承是两个类之间的固定(也就是编译时)关系,而委托可以在运行时定义(在语言中支持这个)。另一方面,继承为多态提供了更好的支持。

委托是一个巨大的话题(就像继承一样),你可以阅读很多关于它的内容。最后,决定是使用委托还是继承归结为决定您是否想要“is-a”或“has-a”关系,因此列出选择指南并不容易。

对我来说,基本上,创建代表的决定来自以下观察:

  1. 我的代码呈现了一组同质的行为(这里的同质意味着可以被识别为具有共同的“性质”);

  2. 这些行为可能是针对特定情况“定制”的(例如,替换为替代行为)。

这是我的个人观点,也是对我识别“委托”模式的方式的描述。这可能与我的编程学科受到重构原则的强烈影响这一事实有很大关系。

真的,IMO,委派是为你的班级定义“定制”点的一种方式。例如,如果您有某种抽象的工作流程,在每个步骤中您根据特定条件采取一些行动;此外,这些具体行动可以被另一种替代,那么我看到了通过授权重用的机会。

希望这可以帮助。

于 2012-07-02T13:46:27.327 回答