策略组模式作用:
定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换。本模式使得算法可以独立于使用他的客户端而变化。如果你发现你的程序中有一个很长的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>";