zoukankan      html  css  js  c++  java
  • php 设计模式之策略者模式

      1 <?php
      2 header('Content-Type:text/html;charset=utf-8');
      3 /**
      4  * 策略模式演示代码
      5  *
      6  * 为了更好地突出“策略”,我们这里以出行为例演示,日常出行大概分为以下几种工具:自驾车,公交车,地铁,火车,飞机,轮船
      7  * 结构:
      8  *    抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
      9  *    具体策略角色:包装了相关的算法和行为。
     10  *    环境角色:持有一个策略类的引用,最终给客户端调用。
     11  * 应用场景:
     12  *          抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
     13  *          具体策略角色:包装了相关的算法和行为。
     14  *          环境角色:持有一个策略类的引用,最终给客户端调用。
     15  * 步骤:
     16  *      定义抽象角色类(定义好各个实现的共同抽象方法)
     17  *      定义具体策略类(具体实现父类的共同方法)
     18  *      定义环境角色类(接收保存实例,统一执行策略类接口方法)
     19  *
     20  * 下面一起看代码,领会何为策略模式
     21  */
     22 
     23 /**
     24  * Interface Travel 抽象策略角色
     25  * 约定具体方法
     26  */
     27 interface Travel
     28 {
     29     public function go();
     30 }
     31 
     32 /**
     33  * Class selfDriving 具体策略角色
     34  * 自驾车
     35  */
     36 class bySelfDriving implements Travel
     37 {
     38     public function go()
     39     {
     40         echo '我自己开着车出去玩<br>';
     41     }
     42 }
     43 
     44 /**
     45  * Class byBus具体策略角色
     46  * 乘公交
     47  */
     48 class byBus implements Travel {
     49     public function go()
     50     {
     51         echo '我乘公交出去玩<br>';
     52     }
     53 }
     54 
     55 /**
     56  * Class byMetro 具体策略角色
     57  * 乘地铁
     58  */
     59 class byMetro implements Travel
     60 {
     61     public function go()
     62     {
     63         echo '我乘地铁出去玩<br>';
     64     }
     65 }
     66 
     67 /**
     68  * Class byTrain 具体策略角色
     69  * 乘火车
     70  */
     71 class byTrain implements Travel
     72 {
     73     public function go()
     74     {
     75         echo '我乘火车出去玩<br>';
     76     }
     77 }
     78 
     79 /**
     80  * Class byAirplane 具体策略角色
     81  * 乘飞机
     82  */
     83 class byAirplane implements Travel
     84 {
     85     public function go()
     86     {
     87         echo '我乘飞机出去玩<br>';
     88     }
     89 }
     90 
     91 /**
     92  * Class bySteamship 具体策略角色
     93  * 乘轮船
     94  */
     95 class bySteamship implements Travel
     96 {
     97     public function go()
     98     {
     99         echo '我乘轮船出去玩<br>';
    100     }
    101 }
    102 
    103 /**
    104  * Class Mine 环境角色
    105  */
    106 class Mine{
    107     private $_strategy;
    108     private $_isChange = false;
    109 
    110     /**
    111      * 构造方法
    112      * 此处使用到了依赖注入和类型约束的概念,详情请参考
    113      *
    114      * @param Travel $travel
    115      */
    116     public function __construct(Travel $travel)
    117     {
    118         $this->_strategy = $travel;
    119     }
    120 
    121     /**
    122      * 改变出行方式
    123      *
    124      * @param Travel $travel
    125      */
    126     public function change(Travel $travel)
    127     {
    128         $this->_strategy = $travel;
    129         $this->_isChange = true;
    130     }
    131 
    132     public function goTravel()
    133     {
    134         if ($this->_isChange) {
    135             echo '现在改变主意,';
    136             $this->_strategy->go();
    137         } else {
    138             $this->_strategy->go();
    139         }
    140 
    141     }
    142 }
    143 
    144 /**
    145  * 客户端使用
    146  */
    147 $strategy = new Mine(new byBus());
    148 // 乘公交
    149 $strategy->goTravel();
    150 // 乘地铁
    151 $strategy->change(new byMetro());
    152 $strategy->goTravel();
    153 // 自驾车
    154 $strategy->change(new bySelfDriving());
    155 $strategy->goTravel();
    156 
    157 //打印:
    158 //我乘公交出去玩
    159 //现在改变主意,我乘地铁出去玩
    160 //现在改变主意,我自己开着车出去玩
  • 相关阅读:
    腾讯游戏是如何使用Docker的
    为Elasticsearch添加中文分词,对比分词器效果
    13个对web设计师有用的JavaScript插件
    七牛是如何搞定每天500亿条日志的
    七牛李道兵谈“架构坏味道”
    接口的解释
    数组
    Div Span
    dl dt dd
    @Razor解析器
  • 原文地址:https://www.cnblogs.com/dawuge/p/9399903.html
Copyright © 2011-2022 走看看