策略模式的简单实现

   
   
   
   
  1. namespace  Strategy; 
  2.  
  3. /** 
  4.  * 抽象算法类 
  5.  * @author struggle 
  6.  * @verison 2012-5-29 
  7.  */ 
  8. abstract class Strategy { 
  9.     /** 
  10.      * 算法方法 
  11.      */ 
  12.     public abstract function algorithmFunction(); 
  13. /** 
  14.  * 具体算法类A 
  15.  * @author struggle 
  16.  * @verison 2012-5-29 
  17.  */ 
  18. class SpecificStrategyA extends  Strategy { 
  19.     /** 
  20.      * 具体算法A的实现 
  21.      */ 
  22.     public function algorithmFunction(){ 
  23.         echo '具体算法A
    '
  24.     } 
  25. }  
  26. /** 
  27.  * 具体算法类B 
  28.  * @author struggle 
  29.  * @verison 2012-5-29 
  30.  */ 
  31. class SpecificStrategyB extends Strategy { 
  32.     /** 
  33.      * 具体算法B的实现 
  34.      */ 
  35.     public function algorithmFunction(){ 
  36.         echo '具体算法B
    '
  37.     } 
  38. /** 
  39.  * 具体算法类C 
  40.  * @author struggle 
  41.  * @verison 2012-5-29 
  42.  */ 
  43. class SpecificStrategyC extends  Strategy { 
  44.     /** 
  45.      * 具体算法c的实现 
  46.      */ 
  47.     public function algorithmFunction() { 
  48.         echo '具体算法C
    '
  49.     } 
  50.  
  51. class Context { 
  52.     /** 
  53.      * 算法对象 
  54.      * @var obj 
  55.      */ 
  56.     private $Strategy ; 
  57.     /** 
  58.      * 设置算法对象 
  59.      * @param Strategy $obj 
  60.      */ 
  61.     public function setStrategy( Strategy $obj){ 
  62.         $this->Strategy = $obj
  63.     } 
  64.      
  65.     public function contextInterface(){ 
  66.         if(!isset($this->Strategy)){ 
  67.            throw new  \Exception('算法对象未设置'); 
  68.         } 
  69.         $this->Strategy->algorithmFunction(); 
  70.     } 
  71.  
  72. $context = new Context(); 
  73. $context->setStrategy(new SpecificStrategyA()); 
  74. $context->contextInterface(); 
  75. $context->setStrategy(new SpecificStrategyB()); 
  76. $context->contextInterface(); 
  77. $context->setStrategy(new SpecificStrategyC()); 
  78. $context->contextInterface(); 

#使用策略与简单工厂的结合

Context类修改如下:

   
   
   
   
  1. class Context{ 
  2.     /** 
  3.      * 算法对象 
  4.      * @var obj 
  5.      */ 
  6.     private $Strategy ; 
  7.     /** 
  8.      * 设置算法对象 
  9.      * @param $obj 
  10.      */ 
  11.     public function __construct($type){ 
  12.        switch (strtoupper($type)){ //全部转换为大写 
  13.             case 'A'
  14.                 $this->Strategy = new SpecificStrategyA(); 
  15.                 break
  16.             case 'B'
  17.                 $this->Strategy = new SpecificStrategyB(); 
  18.                 break
  19.             case 'C'
  20.                 $this->Strategy = new SpecificStrategyC(); 
  21.                 break
  22.             default
  23.                 throw new \Exception('未找到算法类 : '.$type); 
  24.        } 
  25.     } 
  26.      
  27.     public function contextInterface(){ 
  28.         if(!isset($this->Strategy)){ 
  29.            throw new  \Exception('算法对象未设置'); 
  30.         } 
  31.         $this->Strategy->algorithmFunction(); 
  32.     } 
  33.  
  34. $context = new Context('A'); 
  35. $context->contextInterface(); 
  36. $context = new Context('B'); 
  37. $context->contextInterface(); 
  38. $context = new Context('c'); 
  39. $context->contextInterface();