策略模式

策略组模式作用:

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


你可能感兴趣的:(json,算法,function,Class,csv,AIR)