您好,欢迎来到我要学flash网!登录注册

【AS3与设计模式】 Strategy Pattern (策略模式)

来源:我要学flash网 | 作者:admin | 发表时间:2011-07-11 | 点击:  次

[arrow] 关于这一系列的索引页和说明请点这里 http://www.nshen.net/blog/article.asp?id=510

[arrow] 想直接下Strategy演示代码的点这里

先看一下定义吧

The Strategy Pattern: a famly of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

大概意思就是 有一系列算法,把他们每个算法都分别封装起来,使他们可以互相替换。策略模式可以让算法从客户端独立出来,算法的改变不会影响客户端

在网上很容易就可以古狗到策略模式的类图

attachments/200709/03_103000_strategy.gif

每个算法都是一个具体的策略,图中ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC为3 个具体的算法,Strategy模式就是把一组具体的算法(策略)分别封装起来,并把这些封装起来的算法实现共同的一个接口 Strategy ,这个接口就是一个抽象的策略,我们的主类中拥有一个抽象策略的引用声明为Strategy接口类型,所有具体算法们都实现了抽接口中的方法AlgorithmInterface (),由于多态,所以我们可在我们的主类里直接调用抽象接口的方法AlgorithmInterface() ,这样做的好处就是我们可以在run time时使用setter方法改变具体的策略而不影响到客户的代码。

测试代码:
 

  1. package {  
  2.  import flash.display.Sprite;  
  3.  import net.nshen.designpatterns.strategy.*;  
  4.   public class designpatterns extends Sprite  
  5.   {  
  6.     public function designpatterns()  
  7.     {  
  8.       Test_Strategy()  
  9.     }  
  10.       
  11.       
  12.     public function Test_Strategy():void{  
  13.      var context:Context=new Context();  
  14.      //设置策略  
  15.      context.strategy=new ConcreteStrategyA()  
  16.      context.ContextInterface()  
  17.      //runtime 更改策略B  
  18.      context.strategy=new ConcreteStrategyB()  
  19.      context.ContextInterface()  
  20.      //runtime 更改策略C  
  21.      context.strategy=new ConcreteStrategyC()  
  22.      context.ContextInterface()  
  23.     }  
  24.       
  25.   }  
  26. }  


Context:

* 需要使用ConcreteStrategy提供的算法。
* 内部维护一个Strategy的实例。
* 负责动态设置运行时Strategy具体的实现算法。
* 负责跟Strategy之间的交互和数据传递。
 

  1. package net.nshen.designpatterns.strategy  
  2. {  
  3.   public class Context  
  4.   {  
  5.     private var _strategy:IStrategy  
  6.       
  7.     public function set strategy(p_strategy:IStrategy):void{  
  8.      this._strategy=p_strategy;  
  9.     }  
  10.     public function ContextInterface():void{  
  11.      this._strategy.AlgorithmInterface()  
  12.     }  
  13.   }  
  14. }  


Strategy(抽象策略类):

* 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
 

  1. package net.nshen.designpatterns.strategy  
  2. {  
  3.   /**  
  4.    *   
  5.    *   
  6.    * 抽象策略,可以为接口,也可以为一个抽象类,这里是接口  
  7.    *   
  8.    */ 
  9.   public interface IStrategy  
  10.   {  
  11.     function AlgorithmInterface():void 
  12.   }  
  13. }  


ConcreteStrategy(具体策略类):

* 实现了Strategy定义的接口,提供具体的算法实现

具体策略A:
 

  1. package net.nshen.designpatterns.strategy  
  2. {  
  3.   public class ConcreteStrategyA implements IStrategy  
  4.   {  
  5.     public function AlgorithmInterface():void 
  6.     {  
  7.       trace("调用策略A")  
  8.     }  
  9.       
  10.   }  
  11. }  


具体策略B:
 

  1. package net.nshen.designpatterns.strategy  
  2. {  
  3.   public class ConcreteStrategyB implements IStrategy  
  4.   {  
  5.     public function AlgorithmInterface():void 
  6.     {  
  7.       trace("调用策略B")  
  8.     }  
  9.       
  10.   }  
  11. }  


具体策略C:
 

  1. package net.nshen.designpatterns.strategy  
  2. {  
  3.   public class ConcreteStrategyC implements IStrategy  
  4.   {  
  5.     public function AlgorithmInterface():void 
  6.     {  
  7.       trace("调用策略C")  
  8.     }  
  9.       
  10.   }  
  11. }  


[arrow] 完整代码点这里下载

在《head first design patterns》的例子中更把策略描述成行为(Behavior)的抽象,建议去看一下,由于各种各样的鸭子叫的方法和飞的方法各不相同,如下图,把鸭子的多种Fly行为和多种Quack行为独立出来,打包成两个策略包,分别实现两个抽象的接口FlyBehaviors 和 QuackBehaviors ,此时所有鸭子的父类Duck就是上面图中的Context,保存抽象策略的引用 flyBehavior , quackBehavior ,由于策略模式的好处,使得Duck的子类各种各样的鸭子可以run time选择自己相应的行为
attachments/200709/03_104536_a1.jpg


 

attachments/200709/03_104550_a2.jpg

=================理论与实践分割线=========================================================

实际的例子还没找到,希望有实际项目中的例子的兄弟,或者知道某个框架里有用到这个模式的联系一下我

    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    本文引用地址:
      最新评论: 共有位网友发表了评论
      发表评论:
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    评价:
    表情:
    用户名: 密码: 验证码: