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

c# - 处理混合业务和演示代码的最佳方法?

考虑到一个假设的情况,一个旧的、遗留的表示库多年来一直在维护,并且通过仓促更正和缺乏适当的架构监督的过程逐渐将越来越多的业务逻辑编码到其中。或者,考虑一个业务类或命名空间,它没有通过程序集边界与表示分离,因此能够引用 System.Windows.Forms 之类的东西而无需强制添加引用(比简单的 using 子句更清醒的操作) .

在这种情况下,这个 UI 代码使用的业务代码最终会被调用以进行重用并非不可想象。将两层分开以实现这一点的好方法是什么?

我对设计模式非常熟悉——至少在原则上是这样。但是,我没有大量的实践经验,所以我有点不确定自己的直觉。我已经开始为此使用策略模式。这个想法是识别业务逻辑调用 UI 组件以向用户提出问题并收集数据的位置,然后将它们封装到一组接口中。该接口上的每个方法都将包含来自原始工作流的面向 UI 的代码,然后 UI 类将实现该接口。

想要重用相关业务逻辑的新代码也将实现此接口,但替换新窗口或可能的预制或参数化答案来回答最初由 UI 组件回答的问题。这样,商务逻辑可以被视为一个真正的库,尽管传递给它的某些方法的接口参数有些尴尬。

这是一个体面的方法吗?我应该如何更好地解决这个问题?我将听从您的集体互联网智慧。

谢谢!

0 投票
3 回答
1777 浏览

c# - 多个方法的正确 C# 设计模式是什么,所有方法都接受不同的派生类作为参数?

我有一个基类:

和两个派生类:

这些类型在代码的另一部分中使用,如下所示:

这些方法不在 Message 类中,因为处理不是消息的一部分。

现在,我想避免使用 if/else/switch 结构,因为消息类型很多。在这里使用的最佳设计模式是什么?

一种选择是使用策略模式进行封装(至少据我了解):

但是,让所有处理方法都接受基本类型 Message 并在里面进行转换真的是最佳实践吗?另一个问题是消息的动态类型(简单或复杂)实际上存储在这个类的两个地方——消息和过程算法,这看起来有点难看。

有没有更好的解决方案?

谢谢!!
阿萨夫

0 投票
3 回答
2102 浏览

java - 如何用策略实现单例?

我正在改编来自 Google Android 博客的Image Downloader 。我想ImageDownloader成为单身人士,因为我将在我的应用程序的多个地方使用它。我还希望能够Bitmaps使用不同的方式进行操作Strategies(例如生成透明位图)。

语境:

我希望能够ImageDownloader在一个活动中使用并设置透明位图,而在另一个活动中使用相同ImageDownloader但使用不同的策略对象获取黑白位图。

0 投票
1 回答
841 浏览

strategy-pattern - 策略模式替换 if/else 或 case 语句

为什么在我看来,使用策略只是将 if/else 推迟到工厂?使用策略,工厂不需要弄清楚要实例化哪个具体类,它不是通过 if/else 来实现的吗?

以某种方式使用 Map/List 的另一种选择,并让键是要实例化的类的名称,并且可能让使用 Factory 的类传入名称?

0 投票
2 回答
5502 浏览

php - 不能从类中调用静态方法作为变量名?

我正在使用 php 5.2.6。我有一个策略模式,这些策略有一个静态方法。在实际实现其中一种策略的类中,它获取要实例化的策略类的名称。但是,我想在实例化之前调用其中一种静态方法,如下所示:

但它给了T_PAAMAYIM_NEKUDOTAYIM

这会在 5.3 中工作吗?

0 投票
5 回答
29092 浏览

c# - 没有“switch”语句的策略模式?

我一直在阅读策略模式,并且有一个问题。我在下面实现了一个非常基本的控制台应用程序来解释我在问什么。

我已经读过,在实施策略模式时,使用“switch”语句是一个危险信号。但是,我似乎无法摆脱在这个例子中使用 switch 语句。我错过了什么吗?我能够从Pencil中删除逻辑,但我的Main现在有一个 switch 语句。我知道我可以轻松创建一个新的TriangleDrawer类,而不必打开Pencil类,这很好。但是,我需要打开Main以便它知道将哪种类型的IDrawer传递给Pencil. 如果我依赖用户输入,这只是需要做的吗?如果有办法在没有 switch 语句的情况下做到这一点,我很乐意看到它!

实施的解决方案如下所示(感谢所有回复的人!)这个解决方案让我明白了使用新的IDraw对象我唯一需要做的就是创建它。

0 投票
7 回答
39560 浏览

design-patterns - 使用策略模式和命令模式

两种设计模式都封装了算法并将实现细节与其调用类分离。我能辨别的唯一区别是策略模式接受参数来执行,而命令模式没有。

在我看来,命令模式需要在创建时提供所有执行信息,并且它能够延迟其调用(可能作为脚本的一部分)。

哪些决定指导是否使用一种模式或另一种模式?

0 投票
6 回答
13217 浏览

c# - 如何指定接口的实现者抛出的异常?

我目前正在开发一个解决方案,并以一种能够强有力地实现策略/提供者模式的方式对其进行设计。因此,该解决方案公开了许多接口并包含这些接口的默认实现,这些接口可以通过 DI 类型方法进行替换。

在宿主应用程序使用许多这些接口的地方,它期望处理可能发生的某些异常,例如IDataRetriever接口有一个方法SomeDataType GetData(int timeout);,宿主可以处理一些自定义异常,例如DataRetrievalTimeoutExceptionNetworkConnectionException

我的问题是,标记接口类的最佳方法是什么,这样当开发人员实现它时,他们会知道应该抛出某些异常并由主机处理?

目前,我刚刚将异常 xml 标记添加到方法 xml 注释中 - 这是否足够?

0 投票
2 回答
84 浏览

c# - 替换通过 DI 容器注入的策略是有效的部署机制吗?

我正在创建一个使用 DI 容器向其中注入策略的应用程序。部署时,如果我需要更改这些策略,那么使用新策略部署新程序集并修改配置文件以指示 DI 容器使用哪种策略是有效的部署策略吗?

我担心的是机器上应用程序的版本控制会变得有点模糊,因为不同的 dll 会有不同的版本号。

0 投票
3 回答
187 浏览

php - 这段代码太脆弱了吗?

我需要创建一个策略模式,其中用户从二十或三十个独特策略对象的列表中选择四个策略。策略列表将随着项目的成熟而扩展,用户可以随时更改他们选择的策略。

我打算将他们选择的策略名称存储为字符串,然后使用类似这样的方法来加载与他们选择的字符串对应的策略类。

我试图避免一个大的 switch 语句。我担心的是,这似乎有点Stringly Typed。有没有更好的方法来实现这个目标而不使用条件或大型 switch 语句?

BTW:用户在选择四种策略时没有输入字符串。我需要维护一个字符串列表以在选择框中呈现给用户,并在添加新策略对象时将新字符串添加到列表中。

解释
ircmaxell对我正在尝试做的事情表示了一些困惑。在上面的例子中,用户从一个列表中选择了四个策略,并将它们作为字符串数组传递给 StrategyManager 构造函数。相应的策略对象被创建并存储在一个内部数组中,$this->selectedStrategies

“first”、“second”、“third”和“fourth”是四种不同选择策略的内部数组的数组键。建立 StrategyManager 对象后,应用程序execute在流程生命周期的不同时刻使用四种策略的方法。

所以,简而言之......每次应用程序需要执行策略编号“一”的方法时,它都会执行此操作,并且结果会根据用户为策略“一”选择的策略而有所不同