// 策略者模式

/**

  • 类名:Tactics
  • 说明:策略者类,根据需要添加新的数据格式,只需要定义一个新的类名(比如HtmlData),方法名(getData)不变,将该方法的具体内容实现即可
    */
    class Tactics {
    // 示例数组
    protected $demoList;

    public function __construct() {

    }

    /*

    • 添加数据
      */
      public function addData($key,$value){
      $this->demoList[$key] = $value;
      }

    /*

    • 根据数据传递的数据格式对象,输出不同的数据格式
      */
      public function getTactics($obj) {
      return $obj->getData($this->demoList);
      }
      }

/**

  • 类名:JsonData
  • 说明:Json格式的数据
    */
    class JsonData {
    public function getData($data) {
    return json_encode($data);
    }
    }

/**

  • 类名:XmlData
  • 说明:xml格式的数据
    */
    class XmlData {
    public function getData($data) {
    $xml = '<?xml version="1.0" encoding="utf-8"?>';
    $xml .= '<data>';
    foreach ($data as $key => $value) {
    $xml .= '<group>';
    $xml .= '<key>'.$key.'</key>';
    $xml .= '<value>'.$value.'</value>';
    $xml .= '</group>';
    }
    $xml .= '</data>';
    return $xml;
    }
    }

// 实例化策略者类的对象
$tacticsObj = new Tactics();

// 给类中的属性赋值
$tacticsObj->addData('name','张三');
$tacticsObj->addData('age','18');

// 传递JsonData类型的对象,获取Json数据格式
echo $tacticsObj->getTactics(new JsonData);
// 传递XmlData类型的对象,获取xml数据格式
echo $tacticsObj->getTactics(new XmlData);



策略者模式小示例