策略模式和委托模式的区别

24

策略模式与委托模式(非委托)有何区别?

4个回答

29

策略模式是解决常见软件问题的一种非常具体的设计方案。

策略模式意味着将会有:

  • 一个名为Strategy(或者包含Strategy在名称中)的接口。该接口应该有一个名为execute()的方法。
  • 一个或多个名为ConcreteStrategyA、ConcreteStrategyB等的具体类,这些类实现了Strategy接口。
  • 还应该有一个包含Strategy的上下文类。

委托更像是一种原则而不是一种模式。委托意味着代替单个对象负责所有事情,将职责委托给其他对象。之所以这是一种常见的技术,是因为它通过减少耦合和增加内聚性来执行两个更基本的软件开发原则。

说了这么多,不要担心模式。专注于原则,如果感觉自己的解决方案可以改进-看看模式是否有更好的方法。如果你把重点放在模式而不是原则上,你会发现自己迷失在所有的模式中,并且为了实现模式而实现模式。


2
委托模式和依赖注入是同一件事吗? - sivabudh
1
@ShaChris23:不是的。依赖注入消除了依赖项的硬编码,并允许在运行时或编译时使用那些依赖项的替代实现。使用依赖项的类不负责创建该依赖项:它是从外部“注入”的。委托模式只是将工作委托给其他对象。这些对象可能是“依赖项”,也可能不是,它们可能已经被从外部注入进来,也可能没有。 - Alex York

13

“委托”并不是一个设计模式,而更像是一种通用的编程技术,其中组件A将任务(任何类型的任务)委派给组件B。委托可以在许多上下文中使用。

另一方面,“策略”模式是一种特定的模式,通常将委派作为实现细节大量使用。

例如,您可以实现策略模式并使用以下方式调用它:

strategy.execute(x)

策略模式涉及到在运行时选择您的策略接口的各种实现,并选择适当的实现。调用该实现的行为是委派。

因此,这不是非此即彼的问题,这些概念是互补的。


1
我知道如何使用委托来实现策略模式。维基百科对委托模式和策略模式都有定义,但两者并没有相互引用。这让我想知道它们的意图是否不同。http://en.wikipedia.org/wiki/Strategy_pattern http://en.wikipedia.org/wiki/Delegation_pattern谢谢。 - hIpPy
你可以认为策略模式比委托模式更高级(甚至更加复杂)。而且,委托模式可能更常见。 - skaffman
1
维基百科上的委托模式看起来像胡说八道...我不认为它是一个真正的模式。它不是一个广为人知或被接受的模式。模式的目的是,当你谈论特定的模式时,房间里可能有100个开发人员,所有人都已经知道默认的类、结构、方法和关系。我怀疑如果你向100个开发人员提到“委托模式”,大多数人会给你疑惑的表情。 - mson
1
@mson:说“模式的目的”是为了当一个开发人员谈论它时,其他99个人知道他在说什么,显然是不正确的。软件设计模式的目的是以高效的方式解决某些问题,让您拥有一个现在可用且易于维护和更改的代码库,以便将来也能正常工作。诚然,当您讨论模式时,其他团队成员知道您在谈论什么是...令人向往的!但这不是模式的“目的”。 - Alex York
@mson 仅仅因为一个模式在你最喜欢的编程语言中没有被使用,并不意味着它不是一种模式。例如,委托模式 在 Objective-C 中是一种非常常见的模式。有趣的思想实验是,如果你最喜欢的语言似乎有很多模式,那么这个语言可能存在某些缺陷,人们需要在其中解决一些问题。 - ThisCompSciGuy
@ThisCompSciGuy - 一个5岁的孩子可以乱按键盘并称之为“拳头花纹”。大多数软件开发人员可能不会理解它,它也不会真正成为一种模式。那个5岁的孩子可以让他的同学们理解并使用这个“拳头花纹”。但是,大多数软件开发人员可能不会理解它,它也不会真正成为一种模式...如果那个5岁的孩子可以让成千上万的电脑科学专业人员、Jon Skeet和数万名开发人员理解并使用他的“拳头花纹”,那么它可能是一个模式。 - mson

2

有一个想法:

委托模仿委托类(至少我是这样使用的,不确定是否是规范方式,但通常是这样做)。因此,如果我有一个具有多个入口点(方法)的类,并且我想在运行时更改实现,则会创建实现相同接口的委托。

另一方面,如果我想要在运行时交换类的某个部分,则会创建策略类,其中包含单个方法接口(例如executeCalculation),并将其作为包含类的聚合组件。

因此,策略涵盖单个行为,委托实现一组行为,您可以使用委托来实现策略。


1
如果你指的是策略模式和委托模式之间的区别,就是将函数/lambda作为参数传递, 那么至少我知道在委托方面,需要编译的类较少,因此开销较小。
实际上,我找到这个页面是想让别人给我一些关于仍然使用设计模式路线的好处的想法,考虑到Java 8和C#现在都支持将函数作为参数传递。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接