原文链接:http://www.orlion.ga/714/

解释:

    策略情势帮忙构建的靶子无须包含我的逻辑,而是可以基于需要运用其余对象被的算法。

 

需求:

    大家自然有一个CD类:

class CD{

    private $title;

    private $band;

    public function __construct($title , $band) {
        $this->title = $title;
        $this->band = $band;
    }

    public function getAsXml(){
        $doc = new \DOMDocument();
        $root = $doc->createElement('cd');
        $root = $doc->appendChild($root);
        $title = $doc->createElement('title' , $this->title);
        $title = $root->appendChild($title);
        $band = $doc->createElement('band' , $this->band);
        $band = $root->appendChild($band);

        return $doc->saveXML();
    }
}

    后来大家想为CD以JSON格式输出,这时可以直接入一个getAsJson()方法,不过先前时期咱兴许还会见给CD以其余各样各种的计输入,那些CD最后碰面转换得那一个叠存在很多实例不会合调用的不二法门。这时就好起接近中取出这个点子将这么些补充加到就在用时创制的现实类吃。

    

代码:

    首先设计一个接口在这些接口里规定如兑现格局:

namespace Strategy;

interface ShowStrategy{
    function show(CDStrategy $cd);
}

    然后是XML类:

namespace Strategy;

class CDAsXMLStrategy implements ShowStrategy{

    public function show(CDStrategy $cd) {

        $doc = new \DOMDocument();
        $root = $doc->createElement('cd');
        $root = $doc->appendChild($root);
        $title = $doc->createElement('title' , $cd->title);
        $title = $root->appendChild($title);
        $band = $doc->createElement('band' , $cd->band);
        $band = $root->appendChild($band);

        return $doc->saveXML();
    }
}

    接着是JSON类:

namespace Strategy;

class CDAsJSONStrategy implements ShowStrategy{

    public function show(CDStrategy $cd) {
        $json = [];
        $json['cd']['title'] = $cd->title;
        $json['cd']['band'] = $cd->band;

        return json_encode($json);
    }
}

    然后是行使策略形式后底CD类:

namespace Strategy;

class CDStrategy{

    public $title;

    public $band;

    protected $_strategy;

    public function __construct($title , $band) {
        $this->title = $title;
        $this->band = $band;
    }

    public function setStrategyContext(ShowStrategy $strategy) {
        $this->_strategy = $strategy;
    }

    public function get() {
        return $this->_strategy->show($this);
    }
}

    最后是App.php测试下:

require 'CDStrategy.php';
require 'ShowStrategy.php';
require 'CDAsXMLStrategy.php';
require 'CDAsJSONStrategy.php';

$cd = new Strategy\CDStrategy('what?' , 'Simple Plan');

$xml = new Strategy\CDAsXMLStrategy();
$cd->setStrategyContext($xml);
echo $cd->get();
echo '<br/>';
$json = new Strategy\CDAsJSONStrategy();
$cd->setStrategyContext($json);
echo $cd->get();

 

相关文章

网站地图xml地图