问题标签 [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 回答
681 浏览

design-patterns - 实施策略模式

在实现策略模式时,将决定使用哪种策略的代码放在哪里?一些示例伪代码会有所帮助。

0 投票
2 回答
2833 浏览

java - 使用策略模式的 Java 电子邮件程序

更新:又增加了一个问题(问题#4)。

大家好,

我正在为自己构建一个自定义电子邮件实用程序。现在,为了遵守单一职责原则,我想要以下类:MailerSender、MailProvider 和 EmailObject。MailSender 更像是一个代表,请查看以下内容:

MailSender 需要一个 IMailProvider 电子邮件提供商来完成发送电子邮件的工作。在下面找到它:

我在上面定义了一些策略,但它可以扩展到任何数量。由于 MailSender 可以随时更改它的提供者,它有效地实现了策略模式,对吧?

EmailObject 是一个包含相关电子邮件信息的 POJO:

客户端代码将如下所示:

我的问题是:

1. 我是否实施了策略模式?
2、这个设计好不好?MailProvider 知道 EmailObject 是否有意义?
3. 如果我以后有一个新的 EmailObject 需要附件怎么办?
4. 客户端代码现在需要在创建 MailSender 之前获取特定的 MailProvider ......这有意义吗?

0 投票
2 回答
167 浏览

design-patterns - 成本装饰师

对于每个产品,都有相关的成本计算器,如:折扣、商家折扣、商家奖金、每月折扣等。未来,将添加更多成本计算器。

对于每个成本计算,我们都有一个具体的产品类别和许多装饰器。所有产品都应使用所有计算器,因为计算器决定根据产品属性(如产品商家 ID、类别 ID、颜色等)应用其计算。

而且,我们的系统中有数百万种产品需要计算。所以,我们最好缓存装饰过的计算器。因为,在运行时装饰每个产品实体会很昂贵。但这对于装饰器模式来说很难。在我们的情况下使用这种模式似乎是一种气味。

你有什么建议?我们应该使用装饰器、策略还是责任链模式?或无模式。

0 投票
2 回答
4664 浏览

java - 复合策略模式 - java - 这段代码有多糟糕?

这个问题是我之前帖子的延续: Java 中的访问者模式实现——这看起来如何?

我在重构代码时有点困惑。我正在尝试将我的访问者模式(在上一篇文章中解释)转换为复合策略模式。我正在尝试做这样的事情:

现在,我将定义这样的规则:

现在,我可以验证两种不同类型的对象。这两个可能完全不同:假设我有一个 Store that is Validatable,然后一个Schedulewhich is Validatable。现在,如果我要编写一个看起来像这样的组合:

我会定义一个enum定义哪些检查集去哪里......

最后,我会这样使用它:

我有一种奇怪的感觉,我的设计有缺陷。我不喜欢我的 Rule 界面需要Validatable. 您能否建议我如何改进这一点?

感谢你的帮助。

0 投票
2 回答
1899 浏览

oop - 模板方法和策略设计模式

这可能是一个新手问题,因为我是设计模式的新手,但我正在查看模板方法和策略 DP,它们看起来非常相似。我可以阅读定义、检查 UML 并查看代码示例,但在我看来,策略模式似乎只是使用模板方法模式,但您只是碰巧将它传递给对象(即组合)。

就此而言,模板方法似乎只是基本的 OO 继承。

我是否错过了他们差异的一些关键方面?我是否遗漏了一些关于模板方法的东西,使其不仅仅是基本继承?

注意:之前有一篇关于此的文章(672083),但更多的是关于何时使用它,这有助于我更多地了解它,但我想验证我对模式本身的想法。

0 投票
4 回答
2295 浏览

design-patterns - 设计模式 - 策略模式

我是设计模式的初学者。

假设我正在开发一个 C# 应用程序来跟踪开发团队中各个成员执行的开发工作(即项目跟踪器)。

我试图从战略模式中获得灵感。

所以我正在设计我的类和接口如下:

我应该做些什么来改进这个设计?

0 投票
3 回答
491 浏览

design-patterns - 重构帮助 - 策略模式

这里的对象是更新 UI。我通常在客户端上执行此操作,但是此应用程序使用后面的代码。无论如何,我的问题是我正在尝试清理这些 if else 语句,并且我认为策略模式可能是合适的。我不需要为我完成所有事情,但如果你能给我一些指示,让我开始吧。我是否先创建一个接口,然后每个策略都实现该接口?泛型在这里有用吗?接口中应该有哪些类型的方法?任何能让我前进的事情都会非常感激。

谢谢,~ck

0 投票
3 回答
392 浏览

c# - 不同输入的不同算法

在我正在开发的应用程序中,我面临一种情况;我想知道是否有这种设计模式。如下

  1. 用户在 Web 界面上显示,并针对流程使用不同的算法
  2. 用户选择存储在数据库中。
  3. 现在,应用程序应该根据所选算法执行不同的计算。

什么是实施这个的好策略?现在我们正在做的是——

  1. 有一个参考数据库表,其中包含所有算法类型和代码中相应的类名(例如,如果是快速排序算法,那么我们存储 QuickSort)。每次出现新算法时都必须手动更新
  2. 在代码中,获取算法类型并使用反射实例化适当的算法类型。在 C# 中,我们使用类似于下面的代码

    System.Reflection.Assembly 类型 = System.Reflection.Assembly.LoadFile(System.Reflection.Assembly.GetExecutingAssembly().Location.ToString());
    foreach (Type t in types) if (t.Name==classname) createinstanceof(t) //classnames 是从数据库中的引用表中加载的所有类类型的列表。

我的直觉是应该有一个更简单/更好的方法来做到这一点,因为这似乎是一个非常标准的问题。我知道策略模式- 但我想要的是简化并可能删除手动任务。

0 投票
1 回答
204 浏览

php - Zend_Auth:为什么要验证名为适配器的对象而不是策略?

为什么它被称为适配器而不是策略?

0 投票
2 回答
541 浏览

c# - 是否可以将策略模式用于没有共同祖先的数据结构?

我有两个数据结构类(这是我的代码的简化版本)

  • 动物:有一个属性“int Age”
  • 人:拥有一个属性“DateTime Birthday”</li>

我想要完成的是编译“上传”(持久化到数据库),这在所有不同的数据结构类中都很常见。所以主要是我的目标是有一个小的上传方法,看起来像

但问题是,populator返回一个不同类型的对象实例,我试图封装它,因为它们没有共同的属性。(下面代码中的 IDataPopulator.TResult Populate(string data))

有没有办法解决这个问题?还是策略模式不适合这种情况?

这是我一直在使用的代码