问题标签 [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 投票
3 回答
2490 浏览

c# - 关于装饰器和策略模式 C# 的设计 OOP 问题

例如说你有一个基础抽象类

并拥有系统中的行为/算法

等等等等

现在你有多个实现它的类,具体的 IFlyable、ISwimmable 等

等等等等

一种是使用 Foo 基类中的策略模式来交换行为。

我们也可以使用装饰器模式将其包装为特定的行为,但由于装饰器使用基类包装它,如果稍后我们向对象添加更多行为,我们如何真正允许打开关闭原则在不触及基类的情况下工作。由于这些行为在我们添加更多时可能具有不同的签名,而不仅仅是例如调用装饰器

我想我的问题是如果我添加更多行为,我怎么能不修改基类并且仍然能够说添加 IWeaponBehavior、ISomeBehaviour 到一个类。

例如我想上课

但是我想给它一些 ISomeBehaviour 的行为,有没有办法可以说用这些行为包装它,或者更像是一个 ConcreteFoo 用这些行为包装它,现在做一些事情而不是在具体 xyz 上实现接口虽然这让你实现了这么多种具体的行为类,比如游泳行为、空行为等,但没有办法摆脱它。

有没有办法在设计模式中做到这一点?它几乎看起来像是一种混合模式。

我知道,如果它像鸭子一样走路,像鸭子一样嘎嘎叫,但需要电池,那么你的抽象就有问题了。

希望这是有道理的。

0 投票
14 回答
73689 浏览

java - 工厂模式和策略模式有什么区别?

谁能解释工厂模式和策略模式之间的区别?

对我来说,除了一个额外的工厂类(在工厂模式中创建一个产品对象)之外,两者看起来都一样

0 投票
5 回答
1475 浏览

c++ - Functor 类在构造函数中工作

我正在使用 C++ 模板来传递策略函子来改变我的函数的行为。它工作正常。我传递的仿函数是一个没有存储的无状态类,它只是以经典仿函数的方式重载了 () 运算符。

我经常这样做,而且效果很好,而且我经常使用传入的 6 或 7 个模板化仿函数来制作模板!

但是我担心代码的优雅和效率。函子是无状态的,所以我假设 Operation() 构造函数是免费的,并且对函子的评估与内联函数一样有效,但像所有 C++ 程序员一样,我总是有一些挥之不去的疑问。

我的第二个问题是我是否可以使用另一种仿函数方法.. 一种不会覆盖 () 运算符的方法,而是将构造函数中的所有内容作为副作用!就像是:

我从未见过有人使用构造函数作为仿函数的“工作”,但它似乎应该工作。有什么优势吗?有什么缺点吗?我确实喜欢删除奇怪的双括号 "Operator()(a)" ,但这可能只是美观。

0 投票
19 回答
72818 浏览

design-patterns - 模板方法和策略模式有什么区别?

有人可以向我解释一下模板方法模式和策略模式有什么区别吗?

据我所知,它们 99% 是相同的——唯一的区别是模板方法模式有一个抽象类作为基类,而策略类使用由每个具体策略类实现的接口。

然而,就客户而言,它们以完全相同的方式被消耗——这是正确的吗?

0 投票
9 回答
812 浏览

oop - 策略设计模式的确切定义是什么?

我与某人就战略模式的真正含义发生了一场极客之争,我需要一位专家来解决这个问题。

我们都同意策略模式允许在运行时交换类的内容(例如行为),同时保持相同的接口。然而,她的论点是“为了使 [算法] 成为一种策略,你必须得到相同的结果”。我的论点是,交换“算法”或类的逻辑可能意味着覆盖操作的结果不同,但它仍然符合策略模式的目的、意图(和分类)。

她带有注释的代码示例:


根据您的定义,一个类的任何子类都是一种策略。它们具有相同的方法定义(签名),因此可以互换。

前两个是策略。因为对于任何输入,他们都会给你完全相同的答案。最后一个不是。仅仅因为它给你一个 int 并不能使它成为一种策略。他们必须“做”同样的事情。

您不能仅仅为了使它们成为一种策略而使用“更高”的抽象术语。

这些都做“数学”,但他们并不是都以不同的方式做“相同”的事情。这就是战略的本质。

那么,谁是对的?

0 投票
4 回答
757 浏览

c# - 为构造函数实现策略

在 C# 中为模板/抽象类的构造函数实现策略的最佳方法是什么?我有几个类都基于解析构造函数中的字符串。解析是在一个静态方法中完成的,该方法创建键值对列表并且对于所有类都是通用的,但是某些字段对于所有类也是通用的——因此我使用了一个抽象模板类。

问题是我没有看到继承抽象基类的构造函数实现的方法。否则,我将在基类中实现构造函数策略,并强制在一些抽象方法中处理列表。

编辑:为模板类添加了无效代码

0 投票
7 回答
1677 浏览

c# - C#中的策略模式

我一直在阅读 Head First Design Patterns (最近才出现),并且正在阅读有关策略模式的内容,我突然想到这可能是在所有我在工作中使用的特定对象,但我对此有疑问。

这就是我的想法:

您可能已经注意到没有声明 FederalTaxRate,这就是我想问的。那应该去哪里?

  • 将它传递给每个具体 Itax 的构造函数似乎是多余的,并且会导致不正确的行为(所有税收计算器必须共享完全相同的联邦税率)。
  • 同样,创建 Itax 的成员也会使它们不一致。

所有的税收计算器都应该继承自静态定义的其他类以及 Itax 吗?

0 投票
1 回答
891 浏览

model-view-controller - 如何在 Web MVC 框架中正确实现策略模式?

在我的 Django 应用程序中,我有一个模型(我们称之为 Foo),其中包含一个名为“type”的字段。我想使用 Foo.type 来指示 Foo 的特定实例是什么类型(可能的选择是“数字”、“日期”、“单行文本”、“多行文本”等等) .

我希望“类型”字段最终影响两件事;一个值从其普通类型转换为文本的方式(例如,在“日期”中,它可能是str(the_date.isoformat())),以及一个值从文本转换为指定类型的方式(在“日期”中,它可能是datetime.date.fromtimestamp(the_text))。

对我来说,这似乎是策略模式(我可能完全错了,如果我错了,请随时纠正我)。我的问题是,在 Web MVC 框架中进行编码的正确方法是什么?

在客户端应用程序中,我将使用抽象方法“serialize()”和“unserialize()”创建一个 Type 类,在 Type 的子类(例如 NumberType 和 DateType)中覆盖这些方法,并动态设置“type " 在运行时将新实例化的 Foo 字段添加到适当的 Type 子类。

在 Web 框架中,这对我来说并不那么简单。现在,最有意义的方法是将 Foo.type 定义为 Small Integer 字段并定义一组有限的选择(0 =“数字”,1 =“日期”,2 =“单行文本”,等)在代码中。然后,当实例化 Foo 对象时,使用 Factory 方法查看实例的“type”字段的值并插入正确的 Type 子类(如上段所述)。Foo 也有 serialize() 和 unserialize() 方法,它们将直接委托给插入的 Type 子类。

这个设计听起来怎么样?我以前从未遇到过这个问题,所以我真的很想知道其他人是否有,以及他们是如何解决的。

0 投票
5 回答
1478 浏览

oop - 策略模式是否违反单一职责原则?

如果单一职责原则规定每个对象都必须有一个更改的理由,并且使用策略模式(根据定义)实现的单个策略类具有多个可以因多种原因而更改的方法,这是否意味着不可能实现不违反 SRP 的策略模式?

0 投票
0 回答
5506 浏览

design-patterns - 依赖注入只是策略模式的另一个名称吗?

这些术语是否相等,或者依赖注入和策略模式之间有什么重要区别?在我看来,马丁福勒似乎只是用一个更吸引人的名字重命名了策略模式,我错过了什么吗?