问题标签 [strategy-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
14136 浏览

c# - 接口中具有不同参数的策略模式(C#)

我基本上是在尝试实现一个策略模式,但我想将不同的参数传递给“接口”实现(从同一个对象继承)并且不知道这是否可能。也许我选择了错误的模式,我得到一个类似于

'StrategyA' 没有实现继承的抽象成员 'void DoSomething(BaseObject)'

使用以下代码:

0 投票
3 回答
245 浏览

c# - 具有不同返回类的策略模式实现

我有一个 MessageProcessor 类,它处理不同类型的 xml 消息。基于消息类型的 switch 语句 (C#) 调用适当的方法来解析 xml 并提取消息类型所需的数据。

我宁愿有一些解析器类,其中一个将在基于消息类型创建时注入到 MessageProcessor 中。Switch 被多态性所取代——到目前为止一切都很好。

但是,我遇到的问题是当前的解析器方法每个都返回不同的结果,例如 ParseExecute(xml, out Session), ParseCallback(xml, out id, out name, ...)

在这种情况下可以做我想做的事情吗?

0 投票
3 回答
1673 浏览

design-patterns - 模板方法(分离)和策略模式之间的区别?

我的老师是一位非常好的老师,我倾向于理解他的观点,但这一点让我无法理解。他用两种变体解释了模板方法;
- 统一:标准变体,由一个抽象类和一些抽象方法组成,这些抽象方法定义了其他固定算法的变体部分。
- 分离:他自己的变体(我认为?),其中一个类包含 templateMethod() 并使用对接口的委托来改变算法的各个部分,这在我看来与策略模式完全一样。

谁能明白他的观点是什么,以及“分离”变体与策略模式有何不同?
我附上了一张图片,其中包含他书中的两种模式(尚未出版)。

http://img64.imageshack.us/img64/3620/strategytemplate.jpg

0 投票
6 回答
1235 浏览

c# - C#:抽象策略基类作为策略对象的抽象工厂

我正在尝试为我的公司创建一个基于 Web 的工具,该工具本质上是使用地理输入来生成表格结果。目前,三个不同的业务领域使用我的工具并获得三种不同的输出。幸运的是,所有的输出都基于相同的主表 - 子表的想法,它们甚至共享一个共同的主表。

不幸的是,在每种情况下,子表的相关行都包含截然不同的数据。因为这是唯一的争论点,所以我将一个FetchChildData方法提取到一个名为DetailFinder. 结果,我的代码如下所示:

其中 PlanningFinder、OperationsFinder 和 MaintenanceFinder 都是 DetailFinder 的子类。

我刚刚被要求添加对另一个业务领域的支持,并且不愿意继续这种if块趋势。我更希望有一个如下所示的解析方法:

但是,我不知道如何DetailFinder知道哪些子类处理每个字符串,甚至不知道存在哪些子类,而不仅仅是将 if 块转移到Parse方法中。有没有办法让子类在 abstract 中注册自己DetailFinder

0 投票
4 回答
2715 浏览

java - 这个 Java 策略模式有多余的 Context 类吗?

以下代码示例是从 Wikipedia 复制的 Strategy 模式的实现。我的完整问题如下...

维基的main方法:

图案片:

具体考虑上面的例子,Context类是多余的吗?

例如,我可以main通过使用除 Context 之外的现有类和接口来提出以下替代实现,并且它的工作方式完全相同。它仍然是松耦合的。

((编辑:在这个简单的场景中,当我省略 Context 类时,我会犯下一个错误吗?))


摘要更新

以点的形式列出通过答案和评论发现的内容:

  • 上下文允许组合策略的使用方式发生变化(例如,它的调用时间)。在调用给定策略之前和之后,不同的上下文可能会做不同的内部工作。
  • 上下文是一个高级的“黑匣子”。上下文逻辑可以更改,复合策略也可以更改(或使用不同的策略)而不会破坏客户端,因为客户端只了解如何调用上下文。
  • 尽管我通过省略 Context 创建了 Wikipedia 示例代码的替代实现,并且虽然它与原来的工作方式相同,但整个情况都被简化了(在这两种情况下),我的更改实际上意味着:1. 它不是一个策略模式不再,2。我想念这里提到的策略模式精神的好处。
  • 我的替代实现使用了 Context 之类的 main 方法,所以如果有效地模拟它,我不妨保留 Context。通过创建不纯的策略模式,造成了混乱。我不需要重新发明轮子或尝试变得更聪明(在这种情况下)。

如果任何其他点有用或需要更正,请发表评论,我会相应地修改列表。

0 投票
4 回答
5526 浏览

design-patterns - 在策略模式中,策略是否可以将 Context 作为参数


反馈总结

我现在将关闭此标题(我认为不会有更多反馈)并尝试总结我所理解的内容

  1. 使用“上下文”作为我的策略的参数引入了应该避免的紧密耦合,并且还可能迫使我公开可能应该隐藏在类中的属性。
  2. 为了最小化耦合,最好为策略提供所需的值或至少使用接口而不是具体类型。

我试图对策略模式有一个清晰的概述,并且我在问自己,让策略取决于上下文是一个好还是坏的设计。

让我们采取以下经典实现

我见过的所有示例都有非常简单的策略,它们采用基本参数(例如整数)。我想知道的是,如果策略使用 Context 来完成工作,是否有问题。

它会给出类似的东西

并且调用会给出

这种“耦合”要避免吗?可以吗?

0 投票
4 回答
990 浏览

c# - 尝试使用新 Func 理解维基百科策略模式示例

我在看这个,http ://en.wikipedia.org/wiki/Strategy_pattern ,我理解策略模式的概念,但有人可以解释一下 C# 示例。

我并没有真正了解 Context 类中“策略”定义的方式和原因,为什么会这样,Func<T, T, T>但只有两个参数传入例如 8,9 ?

0 投票
2 回答
6924 浏览

objective-c - 如何在 Objective-C 中创建策略模式?

我需要开发一个策略模式,其中我有一个主类和其他三个类,我需要使用主类对象引用其他三个类的对象。要解决这个问题,策略模式对我有帮助吗?如果是这样,请给我Objective-C中的语法?

0 投票
1 回答
343 浏览

c# - 在匿名方法中捕获委托

考虑

_captureAction 将调用 printAction 的原因是该行

实际上翻译成

因此 CaptureActionFromParam() 中 _captureAction 捕获的动作不会改变 - 只有 TestSimpleCapturedAction() 中的本地“动作”变量受到影响。

在这种情况下,我想要的行为是不调用 printAction。我能想到的唯一解决方案是这样定义一个新的“委托容器”类:

这可行,但我想知道是否可以在不引入这个新抽象层的情况下实现我想要的行为。实施策略模式很容易导致这种情况,因此人们会认为该语言和/或 BCL 会以某种方式原生支持它。

谢谢 !

0 投票
2 回答
3749 浏览

c# - 带有 IOC 容器的策略设计模式 - 特别是 Ninject

我有一个需要使用策略设计模式的类。在运行时,我需要切换不同的算法来查看对应用程序性能的影响。

有问题的类目前在构造函数中有四个参数,每个参数代表一个算法。

如何使用 Ninject(或通用方法)我仍然可以使用 IOC 但使用策略模式?

当前的限制是我的内核(容器)知道每个算法接口,但只能绑定到一个具体的类。目前我能看到的唯一解决方法是在构建时传入所有八种算法,但使用不同的接口,但这似乎完全没有必要。如果我不使用 IOC 容器,我不会这样做,所以必须有一些方法可以解决这个问题。

代码示例:

人需要使用这两种算法,所以我可以在运行时切换。但只有 TestAlgorithm 是绑定的,因为它是容器中的第一个。