`
androidssh
  • 浏览: 112120 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java设计模式之strategy(策略模式)和policy模式(泛化的strategy模式)

 
阅读更多

strategy模式

 

定义: 运行时刻选择算法

 

表面上看起来,state模式和strategy模式是非常相似的,但既然他们分成两种不同的模式,就有一定的区别,用一句话来概括就是:

策略用来处理算法方式变化,而状态则是处理状态变化。

具体可以参考:http://blog.csdn.net/lwzcjd/archive/2009/05/19/4201828.aspx

 

下面举个strategy的例子:


 

  1. package com.factory.commonality;  
  2. /** 
  3.  * strategy模式的应用。 
  4.  */  
  5. interface Strategy {  
  6.     void algorithmInterface();  
  7. }  
  8. class ConcreteStrategyA implements Strategy {  
  9.     public void algorithmInterface() {  
  10.         System.out.println("Called ConcreteStrategyA.algorithmInterface()");  
  11.     }  
  12. }  
  13. class ConcreteStrategyB implements Strategy {  
  14.     public void algorithmInterface() {  
  15.         System.out.println("Called ConcreteStrategyB.algorithmInterface()");  
  16.     }  
  17. }  
  18. class ConcreteStrategyC implements Strategy {  
  19.     public void algorithmInterface() {  
  20.         System.out.println("Called ConcreteStrategyC.algorithmInterface()");  
  21.     }  
  22. }  
  23. class Context {  
  24.     Strategy strategy;  
  25.     public Context(Strategy strategy) {  
  26.         this.strategy = strategy;  
  27.     }  
  28.     public void doAlgorithm() {  
  29.         strategy.algorithmInterface();  
  30.     }  
  31. }  
  32. public class StrategyPatternTest {  
  33.     public static void main(String[] args) {  
  34.         Context c1 = new Context(new ConcreteStrategyA());  
  35.         c1.doAlgorithm();  
  36.         Context c2 = new Context(new ConcreteStrategyB());  
  37.         c2.doAlgorithm();  
  38.         Context c3 = new Context(new ConcreteStrategyC());  
  39.         c3.doAlgorithm();  
  40.     }  
  41. }  

 

 

运行结果:

Called ConcreteStrategyA.algorithmInterface()
Called ConcreteStrategyB.algorithmInterface()
Called ConcreteStrategyC.algorithmInterface()

 

 

policy模式

尽管 GoF 说Policy 模式只是Strategy 模式的一个别名,但是他们给出的Strategy 模式的例子隐含的假定了strategy 对象只使用一个方法――也就是说假定你已经把可能变化的算法拆成了一段单独的代码。

 

其他人用Policy 模式来表示一个对象有多个方法的情况,对于不同的类,这些方法可能相互独立变化。相对于(Strategy 模式) 只能有一个方法而言,Policy 模式具有更大的灵活性。

 

例如,当某个产品需要被运送到不同国家的时候,与该产品相关的海运政策(shipping policy)可以被用来说明一些与运输有关的问题。这些问题可能包括运输方式,如何计算邮资或者运费,客户需求以及费用,特殊处理的费用等等。所有这些东西可能会互不相干的变化,而且很重要的一点是在运输过程中你可能会在不同地点(points)需要上述信息。

 

通常情况下,把Strategy 模式和Policy 模式区别开来是很有好处的,用Strategy 模式处理一个方法(变化)的情况,而用Policy 模式处理多个方法。  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics