战略模式的实例
我一直在阅读关于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#中)。 我非常喜欢战略模式,因为当项目经理说:“我们希望应用程序能够做,但还不清楚,并且在不久的将来可能会改变时,它已经节省了很多次了。” 我很确定这段视频解释了关于战略模式的一切,以StarCraft为例:http://www.youtube.com/watch?v=MOEsKHqLiBM
属于这一类的东西:
排序(我们想对这些数字进行排序,但我们不知道我们是否会使用BrickSort,BubbleSort或其他排序)
验证(我们需要根据“某些规则”检查项目,但尚不清楚该规则是什么,我们可能会想到新的规则。)
游戏(我们希望玩家在他移动时走路或跑步,但也许将来他也应该能够游泳,飞行,传送,在地下挖洞等)
存储信息(我们希望应用程序将信息存储到数据库,但稍后它可能需要能够保存文件或进行网络调用)
输出(我们需要将X输出为纯字符串,但后来可能是CSV,XML,Json等)
例子
我有一个项目,用户可以将产品分配给数据库中的人员。 将产品分配给某人的状态为“已批准”或“已拒绝”,这取决于某些商业规则。 (例如,用户是否将产品分配给某个年龄段的人,如果该项目中两个字段之间的差异大于50,状态是否被拒绝等,则状态应该被拒绝)。
现在,在发展的时刻,这些商业规则还没有完全清晰,新的规则可能随时出现。 stragety-pattern的力量在于我制作了一个RuleAgent,它给出了一个IRule列表。
public interface IRule {
bool IsApproved(Assignment assignment);
}
在将产品分配给某人时,我创建了一个RuleAgent,给它一个规则列表(这些规则都实现了IRule),并要求它验证一个分配。 它会遍历它的所有规则(因为它们全都实现了相同的接口,都有IsApproved
方法),并且如果它们中的任何一个返回false,则返回false。
现在,当经理突然出现并说,我们还需要拒绝所有女性的任务,或者所有的姓名为“Johnsson”或其他任务的人的任务...你做这样的新班级:
public LastNameRule : IRule
{
public bool IsApproved(Assignment assignment) //Interface method
{
if (assignment.Person.Lastname == "Johnsson")
{
return false;
}
return true;
}
}
public GenderRule : IRule
{
public bool IsApproved(Assignment assignment) //Interface method
{
if (assignment.Person.Gender== Gender.Female)
{
return false;
}
return true;
}
}
您看到您不必继续添加或删除if语句或代码,只需创建一个实现IRUle接口的新规则类并在需要时将其切换出去。
另一个很好的例子(Scott Allen在http://www.asp.net/mvc/pluralsight上的视频系列)他在应用程序的UNit-test部分中使用策略模式的部分)
他建立了一个网站,该网站有一个基于流行度显示项目的页面。 然而,“流行”可以是许多事情(大多数观点,大多数订户,创建日期,大多数活动,最少量的评论,无论如何),并且如果管理层还不知道如何订购,并且可能想要尝试不同的在晚些时候订购。 您使用order方法创建接口(IOrderAlgorithm或somethng),并让Orderer对象将排序委派给IOrderAlgorithm接口的具体实现。 你可以创建一个“CommentOrderer”,“ActivityOrderer”等等,当新的需求出现时就把它们切换出来。
我可以想到几个相当简单的例子:
数据压缩。 你可能有一个ICompressor接口,它的唯一方法如下所示:
byte [] compress(byte [] input);
您的具体压缩类可能是RunLengthCompression,DeflateCompression等。
上一篇: Real World Example of the Strategy Pattern
下一篇: Why should the interface for a Java class be preferred?