zoukankan      html  css  js  c++  java
  • 设计模式---策略模式Strategy(对象行为型)

    1. 概述

      策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

      策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。

    2. 应用场景

      (1)多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为。

      (2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

      (3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

    3. 示例

      出行旅游:我们可以有几个策略可以考虑:可以骑自行车、汽车、火车、飞机。每个策略都可以得到相同的结果,但是它们使用不同的资源。选择策略的依据是费用、时间、方便程度。

     1 <?php  
     2 /** 
     3 * 策略模式 
     4 * 定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化 
     5 * 
     6 */   
     7   
     8   
     9 /** 
    10 * 出行旅游 
    11 * 
    12 *  
    13 */  
    14 interface TravelStrategy{  
    15     public function travelAlgorithm();  
    16 }   
    17   
    18   
    19 /** 
    20  * 具体策略类(ConcreteStrategy)1:乘坐飞机 
    21  */  
    22 class AirPlanelStrategy implements TravelStrategy {  
    23     public function travelAlgorithm(){  
    24         echo "travel by AirPlain", "<BR>
    ";   
    25     }  
    26 }   
    27   
    28   
    29 /** 
    30  * 具体策略类(ConcreteStrategy)2:乘坐火车 
    31  */  
    32 class TrainStrategy implements TravelStrategy {  
    33     public function travelAlgorithm(){  
    34         echo "travel by Train", "<BR>
    ";   
    35     }  
    36 }   
    37   
    38 /** 
    39  * 具体策略类(ConcreteStrategy)3:骑自行车 
    40  */  
    41 class BicycleStrategy implements TravelStrategy {  
    42     public function travelAlgorithm(){  
    43         echo "travel by Bicycle", "<BR>
    ";   
    44     }  
    45 }   
    46   
    47   
    48   
    49 /** 
    50  *  
    51  * 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。 
    52  * 算法解决类,以提供客户选择使用何种解决方案: 
    53  */  
    54 class PersonContext{  
    55     private $_strategy = null;  
    56   
    57     public function __construct(TravelStrategy $travel){  
    58         $this->_strategy = $travel;  
    59     }  
    60     /** 
    61     * 旅行 
    62     */  
    63     public function setTravelStrategy(TravelStrategy $travel){  
    64         $this->_strategy = $travel;  
    65     }  
    66     /** 
    67     * 旅行 
    68     */  
    69     public function travel(){  
    70         return $this->_strategy ->travelAlgorithm();  
    71     }  
    72 }   
    73   
    74 // 乘坐火车旅行  
    75 $person = new PersonContext(new TrainStrategy());  
    76 $person->travel();  
    77   
    78 // 改骑自行车  
    79 $person->setTravelStrategy(new BicycleStrategy());  
    80 $person->travel();  
    81   
    82 ?>   
    View Code
  • 相关阅读:
    【原】list<T>排序
    [原]unity3d刀光剑影(二)
    [原]unity3D bug记录
    [原]重要工具集
    [原]IOS 后台发送邮件
    [转]IOS 崩溃日志大全(二)
    动态二维数组的建立
    struts 学习
    sizeof()与strlen()的区别
    struts配置。泪奔...
  • 原文地址:https://www.cnblogs.com/sydeveloper/p/3772268.html
Copyright © 2011-2022 走看看