策略组模式作用:
定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换。本模式使得算法可以独立于使用他的客户端而变化。如果你发现你的程序中有一个很长的if else或者switch语句,并且他们做着类似的事情的时候就可以采用策略组来重构你的代码。
<?php /** * 策略模式 * @author T.L.Q. */ /** * 图片 * * 图片的相关操作,本例用于演示获得不同格式(json,csv)的图片信息 * * @author T.L.Q. */ class Pic { public $title; // 标题 public $dir; // 图片存放的路径 protected $_strategy; // 策略组对象 public function __construct($title, $dir) { $this->title = $title; $this->dir = $dir; } /** * 设置策略组 * @params Strategy $strategyObject 策略对象 */ public function setStaregyContext($strategyObject) { $this->_strategy = $strategyObject; } /** * 得到格式化好的图片信息 */ public function get() { return $this->_strategy->get($this); } } /** * 策略抽象类 */ abstract class Strategy { /** * 得到格式化好的图片信息 */ abstract function get(Pic $pic); } /** * Json格式策略类 */ class PicAsJsonStrategy extends Strategy { public function get(Pic $pic) { $picJson = array( 'title' => $pic->title, 'dir' => $pic->dir ); return json_encode($picJson); } } /** * Csv格式策略类 */ class PicAsCsvStrategy extends Strategy { public function get(Pic $pic) { $picCsv = "title,dir\n"; $picCsv .= $pic->title . ',' . $pic->dir . "\n"; return $picCsv; } } // 客户端调用 echo "<pre>"; // 初始化 $picObj = new Pic('air', '/data/pic/air.png'); // 设置Csv策略,此次可以用工厂方法封装 $picObj->setStaregyContext(new PicAsCsvStrategy()); // 打印输出: // title,dir\n // air,/data/pic/air.png print $picObj->get(); echo "</pre>";