战略模式的实例

我一直在阅读关于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”等等,当新的需求出现时就把它们切换出来。


    我可以想到几个相当简单的例子:

  • 排序列表。 该策略是用于确定列表中的两个项目中的哪一个是“第一”的比较
  • 您可能有一个应用程序,可以在运行时选择排序算法本身(QuickSort,HeapSort等)
  • Appenders,Layouts和Filters in Log4Net和Log4j
  • UI工具包中的布局管理器
  • 数据压缩。 你可能有一个ICompressor接口,它的唯一方法如下所示:

    byte [] compress(byte [] input);

    您的具体压缩类可能是RunLengthCompression,DeflateCompression等。

  • 链接地址: http://www.djcxy.com/p/57287.html

    上一篇: Real World Example of the Strategy Pattern

    下一篇: Why should the interface for a Java class be preferred?