策略模式的真实示例
我一直在阅读有关OCP原则以及如何使用策略模式来实现这一目标的信息。
我本来打算尝试向几个人解释这一点,但我能想到的唯一例子是根据“订单”的状态使用不同的验证类。
我在网上读过几篇文章,但这些文章通常不会描述使用该策略的真正相似原因,例如生成报告/账单/验证等。
有没有你认为策略模式很常见的真实例子?
我一直在阅读有关OCP原则以及如何使用策略模式来实现这一目标的信息。
我本来打算尝试向几个人解释这一点,但我能想到的唯一例子是根据“订单”的状态使用不同的验证类。
我在网上读过几篇文章,但这些文章通常不会描述使用该策略的真正相似原因,例如生成报告/账单/验证等。
有没有你认为策略模式很常见的真实例子?
那这个呢:
您必须加密文件。
对于小文件,您可以使用“内存中”策略,其中读取完整文件并将其保存在内存中(假设对于<1 GB的文件)
对于大文件,您可以使用其他策略,其中部分文件在内存中读取,部分加密结果存储在 tmp 文件中。
对于同一任务,这可能是两种不同的策略。
客户端代码看起来是相同的:
File file = getFile();
Cipher c = CipherFactory.getCipher( file.size() );
c.performAction();
// implementations:
interface Cipher {
public void performAction();
}
class InMemoryCipherStrategy implements Cipher {
public void performAction() {
// load in byte[] ....
}
}
class SwaptToDiskCipher implements Cipher {
public void performAction() {
// swapt partial results to file.
}
}
这
Cipher c = CipherFactory.getCipher( file.size() );
将返回密码的正确策略实例。
我希望这有帮助。
(我甚至不知道密码是否是正确的词:P)
同样,这是一篇旧帖子,但仍然出现在搜索中,所以我将再添加两个示例(代码在C#中)。我非常喜欢 Strategy 模式,因为当项目经理说:“我们希望应用程序执行'X',但'X'尚不清楚,并且它可能在不久的将来发生变化时,它节省了很多次我的屁股。这个视频解释了策略模式,以《星际争霸》为例。
属于此类别的内容:
排序:我们想要对这些数字进行排序,但我们不知道我们是否要使用BrickSort,BubbleSort或其他排序
验证:我们需要根据“某些规则”检查项目,但尚不清楚该规则将是什么,我们可能会想到新的规则。
游戏:我们希望玩家在移动时要么走路,要么跑步,但也许在未来,他也应该能够游泳,飞行,传送,在地下挖洞等。
存储信息:我们希望应用程序将信息存储到数据库中,但以后它可能需要能够保存文件或进行Web调用
输出:我们需要将X输出为纯字符串,但以后可能是CSV,XML,JSON等。
例子
我有一个项目,用户可以在其中将产品分配给数据库中的人员。将产品分配给某人的状态为“已批准”或“已拒绝”,这取决于某些业务规则。例如:如果用户将产品分配给具有特定年龄的人,则该产品的状态应为“拒绝”;如果项目中两个字段之间的差大于 50,则其状态为“拒绝”,依此类推。
现在,在开发时,这些业务规则尚未完全清楚,并且可能随时出现新的规则。stragety模式的强大之处在于,我制作了一个RuleAgent,它给出了一个IRules列表。
public interface IRule {
bool IsApproved(Assignment assignment);
}
在将产品分配给一个人的那一刻,我创建了一个RuleAgent,给它一个规则列表(这些规则都实现IRule),并要求它验证分配。它将贯穿所有规则。由于它们都实现了相同的接口,因此它们都具有该方法,如果其中任何一个返回false,则返回false。IsApproved
例如,当经理突然走过来并说,我们还需要拒绝所有对实习生的任务,或者对所有加班人员的任务......你创建这样的新类:
public OvertimeRule : IRule
{
public bool IsApproved(Assignment assignment) //Interface method
{
if (assignment.Person.Timesheet >= 40)
{
return false;
}
return true;
}
}
public InternRule : IRule
{
public bool IsApproved(Assignment assignment) //Interface method
{
if (assignment.Person.Title == "Intern")
{
return false;
}
return true;
}
}
你可以看到你不必继续添加或删除if语句或代码,只需创建一个新的规则类来实现IRUle接口,并在需要时将其切换出来。
另一个很好的例子:Scott Allen在 http://www.asp.net/mvc/pluralsight 的视频系列,他在应用程序的单元测试部分使用了策略模式。
他建立了一个网站,该网站有一个页面,根据受欢迎程度显示项目。然而,“流行”可以是很多东西(大多数视图,大多数订阅者,创建日期,大多数活动,最少的评论量等),如果管理层还不知道如何订购,并且可能希望在以后尝试不同的排序。你用一个 order 方法制作一个接口(IOrderAlgorithm 或别的什么),并让 Orderer 对象将排序委托给 IOrderAlgorithm 接口的具体实现。您可以制作“CommentOrderer”,“ActivityOrderer”等...当出现新需求时,只需将其切换出来即可。