PHP设计模式之策略模式(Strategy)入门与应用案例详解

 更新时间:2019年12月10日 10:07:23   作者:luyaran   我要评论
这篇文章主要介绍了PHP设计模式之策略模式(Strategy)入门与应用,结合具体实例形式详细分析了PHP策略模式的相关概念、原理、使用方法及操作注意事项,需要的朋友可以参考下

本文实例讲述了PHP设计模式之策略模式(Strategy)入门与应用。分享给大家供大家参考,具体如下:

这个策略模式,意思就是定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,使用得算法的变化可独立于使用它的客户,简单来讲就是,策略模式设计帮助构建的对象不必自身包含逻辑,而是能够根据需要利用其他对象中的算法。

来看下应用场景:

       1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

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

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

       4、客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式只适用于客户端知道所有的算法或行为的情况。

       5、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

有点模糊是吧,咱就来看一个完整的应用场景:

例如有一个CD类,我们类存储了CD的信息。
原先的时候,我们在CD类中直接调用getCD方法给出XML的结果
随着业务扩展,需求方提出需要JSON数据格式输出
这个时候我们引进了策略模式,可以让使用方根据需求自由选择是输出XML还是JSON
大概了解了之后,咱们来看一个代码实例,我在网上找的啊,比较简单,大家可以根据自己需要的来扩展一下,如下:

<?php
 //策略模式
 //cd类
 class cd {
  protected $cdArr;
  public function __construct($title, $info) { 
   $this->cdArr['title'] = $title;
   $this->cdArr['info'] = $info;
  }
  public function getCd($typeObj) {
   return $typeObj->get($this->cdArr);
  } 
 }
 class json {
  public function get($return_data) {
   return json_encode($return_data);
  }
 }
 class xml {
  public function get($return_data) {
    $xml = '<?xml version="1.0" encoding="utf-8"?>';
    $xml .= '<return>';
     $xml .= '<data>' .serialize($return_data). '</data>';
    $xml .= '</return>';
    return $xml;
  }
 }
 $cd = new cd('cd_1', 'cd_1');
 echo $cd->getCd(new json);
 echo $cd->getCd(new xml);

咱们接下来,再来了解一下一个网上比较经典的案例,来看张图片:

上面图片的意思可以按着下面这个方式来理解:

1.Joe做了一套相当成功的模拟鸭子的游戏。设计了一个超类Duck,然后让各种鸭子继承这个类。

2.后来客户提出要让鸭子有飞的能力。所以Joe就在超类中加了个fly()方法,这样下面的子类都有飞行的行为。

   问题来了:1>原来Duck的子类中竟然有橡皮鸭,橡皮鸭是不会飞的。——Joe用重载的方式,把橡皮鸭的fly()方法设置为空.

                   2>覆盖fly(),我们看到了橡皮鸭的fly()里,没有任何代码,如果以后我们再添加别的不会飞的鸭子,那我么还要这么处理吗?——那么代码重复了!

3.上面2的方式我们知道是有问题的,所以Joe想到把Duck做成接口,这样每个子类必须实现Duck里的方法。这样就保证每个鸭子都能根据自己的需要添加行为。

     问题来了:产品经常处于更新中,规格也在不断的变化。导致每当有新鸭子的时候,Joe就要被迫检查一遍子类是否覆盖了fly()方法。——当你修改某个行为的时候,你必须得往下追踪并在每一个定义此行为的类中修改它。

4.综合以上问题,Joe想到了把那些变化的部分从不变化的位置中抽出来。比如,我们对fly()行为,做了单独的接口FlyBehavior。如果鸭子想要飞行功能的时候,我们就让鸭子实现FlyBehavior.

5.深造:我们想让鸭子有不同的飞行功能,让它在运行时候做不同的飞行动作。让鸭子类实现接口,只能让鸭子有一种行为。

好,接下来看下代码实例:

<?php
interface FlyBehavior{
 public function fly();
}
class FlyWithWings implements FlyBehavior{
 public function fly(){
 echo "Fly With Wings \n";
 }
}
class FlyWithNo implements FlyBehavior{
 public function fly(){
 echo "Fly With No Wings \n";
 }
}
class Duck{
 private $_flyBehavior;
 public function performFly(){
 $this->_flyBehavior->fly();
 }
 public function setFlyBehavior(FlyBehavior $behavior){
 $this->_flyBehavior = $behavior;
 }
}
class RubberDuck extends Duck{
}
// Test Case
$duck = new RubberDuck();
/* 想让鸭子用翅膀飞行 */
$duck->setFlyBehavior(new FlyWithWings());
$duck->performFly();
/* 想让鸭子不用翅膀飞行 */
$duck->setFlyBehavior(new FlyWithNo());
$duck->performFly();

运行结果:

Fly With Wings
Fly With No Wings

咱们可以来总结下在开发过程中,这些设计模式的设计原则,如下:

1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;

2.针对接口编程,不针对实现编程;

3.多用组合,少用继承;

好啦,本次记录就到这里了。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • PHP之APC缓存详细介绍 apc模块安装

    PHP之APC缓存详细介绍 apc模块安装

    这篇文章主要介绍了APC缓,windows和linux中apc模块安装的方法,大家参考使用吧
    2014-01-01
  • 探讨:array2xml和xml2array以及xml与array的互相转化

    探讨:array2xml和xml2array以及xml与array的互相转化

    本篇文章是对array2xml和xml2array以及xml与array的互相转化进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php 网上商城促销设计实例代码

    php 网上商城促销设计实例代码

    前一篇文章讲的是购物车的设计,这篇来讲下关于促销的。支持的促销类似于,打折,买几赠几,满多少钱送礼品等等。用到策略模式
    2012-02-02
  • Smarty模板语法详解

    Smarty模板语法详解

    这篇文章主要介绍了Smarty模板语法,结合实例形式详细分析了Smarty模板的注释、变量、引号、函数等基本语法与使用技巧,需要的朋友可以参考下
    2019-07-07
  • thinkphp配置连接数据库技巧

    thinkphp配置连接数据库技巧

    这篇文章主要介绍了thinkphp配置连接数据库技巧,实例讲述了ThinkPHP入口同目录下配置数据库及控制器另外连接数据库的技巧,需要的朋友可以参考下
    2014-12-12
  • 推荐一款PHP+jQuery制作的列表分页的功能模块

    推荐一款PHP+jQuery制作的列表分页的功能模块

    作者写博目的是记录开发过程,积累经验,便于以后工作参考。本文主要是记录了制作PHP+jQuery 支持 url 分页 / ajax 分页 的列表分页类的过程,有需要的朋友可以参考下
    2014-10-10
  • PHP laravel中的多对多关系实例详解

    PHP laravel中的多对多关系实例详解

    数据表之间是纵横交叉、相互关联的,laravel的一对一,一对多比较好理解,本文重点通过实例给大家讲解 laravel中的多对多关系,感兴趣的朋友一起看看吧
    2017-06-06
  • php post json参数的传递和接收处理方法

    php post json参数的传递和接收处理方法

    今天小编就为大家分享一篇php post json参数的传递和接收处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • PHP那些琐碎的知识点(整理)

    PHP那些琐碎的知识点(整理)

    今天小编给大家分享php那些琐碎的知识点,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-05-05
  • CI框架自动加载session出现报错的解决办法

    CI框架自动加载session出现报错的解决办法

    很多程序员在CI中使用session的时候,开启自动加载session之后网站就报错了,这篇文章主要介绍了CI框架自动加载session出现报错的解决办法,需要的朋友可以参考下
    2014-06-06

最新评论