策略模式的真实示例

2022-08-31 09:45:36

我一直在阅读有关OCP原则以及如何使用策略模式来实现这一目标的信息。

我本来打算尝试向几个人解释这一点,但我能想到的唯一例子是根据“订单”的状态使用不同的验证类。

我在网上读过几篇文章,但这些文章通常不会描述使用该策略的真正相似原因,例如生成报告/账单/验证等。

有没有你认为策略模式很常见的真实例子?


答案 1

那这个呢:

您必须加密文件。

对于小文件,您可以使用“内存中”策略,其中读取完整文件并将其保存在内存中(假设对于<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)


答案 2

同样,这是一篇旧帖子,但仍然出现在搜索中,所以我将再添加两个示例(代码在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”等...当出现新需求时,只需将其切换出来即可。


推荐