2012-11-28 47 views
10

我已经学会了两种模式,但并不了解这两种模式之间的差异。访客和策略模式有什么区别?

我不知道的情况,何时何地使用这些模式。

任何一个可以解释的差异和使用情况?

+3

这是与不同模式相关的好方法:http://www.cours.polymtl.ca/inf3700/divers/nonSoftwareExample/patexamples.html –

+0

尼斯链接@ jco.owens! –

+0

现在链接已损坏..你可以更新@ jco.owens吗? – Joe

回答

3

访问者模式用于遍历对象分层结构并提供类似印刷或报告等一些功能,我用此来提供不同的格式(文本/ HTML)通过写入多个访问者打印的对象分层结构,每一个格式。层次结构中的对象是可见的。

策略模式被用于挑选基于所述输入一个特定的逻辑路径。一个典型的例子是身份验证过滤器,其中基于Authorization HTTP标头中的值,挑选并运行不同的身份验证策略(如NTLM/Negotiate/Basic)。该过滤器将举行一个参考AuthenticationStrategy接口,基于传入请求,特定的身份验证策略是挑选和分配给该参考和遵循并不需要知道所使用的确切策略的代码。

+1

策略模式的一个简单示例 - 使用Comparator的不同实现来对列表进行不同的排序? – Scorpion

15

的主要区别在于,策略模式封装相关行为的一个组,而访问者模式封装多个这样的基团。如果你有一个家庭的算法,你需要在运行时它们之间选择,你应该使用策略模式 -

  • 当你需要封装行为您应该使用策略模式。这很常见:每当你发生这种事情时program to an interface
  • 您应该使用访问者模式实施双重分派 - 如果你有一组需要在关系虚拟到多个对象的算法。这种情况远不那么普遍,部分原因是实施起来难度较大。
+2

+1,你可以通过例子来了解更多细节,但这是一个令人讨厌的简洁答案。 – Scorpion

+0

@dasblinkenlight您能详细说明您的意思吗?“如果您有一组算法需要对多个对象进行虚拟化。” – Geek

+0

@Geek经典的例子是表达式树。一方面,您有一组类遵循复合模式(基本表达式,常量表达式,二进制表达式,函数调用等)。另一方面,您有一组实现算法的类(转换为XML,打印到文本文件,评估等)。因此,您要调用的方法取决于表达式**的子类型和算法的子类型,因此行为对于多个类是虚拟的。它的正式名称是[* double dispatch *](http://en.wikipedia.org/wiki/Double_dispatch)。 – dasblinkenlight

2

访问者模式意图:

代表的操作上的对象结构的元件来执行。访问者可以让你定义一个新的操作而不需要改变它所操作的元素的类。

如果使用Visitor模式:

  1. 类似的操作都必须在一个结构分为不同类型的对象进行
  2. 您需要执行很多不同的和无关的操作。它从物体结构分离操作
  3. 新业务必须添加没有对象结构变化
  4. 收集相关操作成一个类而不是强迫你改变或派生的类
  5. 添加功能到您的或者没有源文件或无法更改源文件的类库

即使访问者轻拍tern提供了增加新操作的灵活性,而无需更改Object中现有的代码,这种灵活性带来了一个缺点。

如果添加了新的Visitable对象,它需要对Visitor & ConcreteVisitor类中的代码进行更改。解决此问题的方法是:使用反射,这会影响性能。

参考oodesign articlesourcemaking文章了解更多详情

策略模式的意图:

定义一系列的算法,封装每一个,使得它们可以互换。策略可以让算法独立于使用它的客户端。

策略可让您更改对象的内脏。

请参阅以下SE问题,了解更多详情:

Real World Example of the Strategy Pattern

0

除了上面提到的行为差异,我也经历了关于相关性的差别和项目中使用的情况下,一旦我工作,如下所示。

例如,访问者知道具体的类。因此,当您向层次结构中添加新的具体类时,您将更加灵活,但需要更改访问者代码。 Strategy中没有这样的事情。在这种情况下,如果您仅使用给定输入返回某些输出的方法,则无论上下文如何,Strategy都会变得更加合适。

此外,Visitor模式还用于实现SOLID的SRP,以分离关注点。

0

访问者适用于当你有一个类的家庭,你需要添加新的功能,该系列的每个类,但不触及类本身(或希望有一个新的功能都在一个地方定义 - - 访问者)

策略适用于当您有一系列类需要能够做某些事情才能正常工作(例如对它们包含的某些对象进行排序),但您希望客户端或您的依赖注入告诉他们该怎么做。

相关问题