适配器模式如同其名,就想电源适配器一样,用于适配不同的东西,只是程序中多用于适配不同的数据格式和驱动。
<?php
/**
* 适配器模式
*
* @author T.L.Q. <email hjq_tlq@163.com>
*/
/**
* 数据提供者,原始的数据来源
*
*/
class DataPervider
{
private $_data;
public function __construct($data)
{
// 这里还可以对数据进行处理,例如将将data里面添加一些默认值等等
// 这里是为了简化,数据可以不是传入,而是从Db或者其他地方的值则
// 如果不是传入的值则可以不写这个构造函数,在下面直接在下面的getData方法中得到数据并且返回
$this->_data = $data;
}
public function getData()
{
return $this->_data;
}
}
/**
* 应用程序接口
*/
class JsonApi
{
private $_dataPerviderObj;
public function __construct(DataPervider $dataPerviderObj)
{
$this->_dataPerviderObj = $dataPerviderObj;
}
public function api()
{
echo json_encode($this->_dataPerviderObj->getData());
}
}
$dataPerviderObj = new DataPervider(array('name' => 'tlq', 'email' => 'hjq_tlq@163.com'));
$apiObj = new JsonApi($dataPerviderObj);
$apiObj->api();
/**
* 新增业务需求,需要将数据用Csv输出
*/
/**
* 数据适配器
* @author T.L.Q.
*
*/
class CsvDataAdapter extends DataPervider
{
private $_name,$_email;
public function __construct($data)
{
parent::__construct($data);
$datas = $this->getData();
$this->_name = $datas['name'];
$this->_email = $datas['email'];
print_r($this->_data);
}
public function getName()
{
return $this->_name;
}
public function getEmail()
{
return $this->_email;
}
public function apiAdapter()
{
}
}
/**
* CsvApi
*/
class CsvApi
{
private $_dataPervider;
public function __construct(DataPervider $dataPervider)
{
$this->_dataPervider = $dataPervider;
}
public function api()
{
$line = $this->_dataPervider->getName();
$line .= ',';
$line .= $this->_dataPervider->getEmail();
$line .= "\n";
echo $line;
}
}
// 实例化的是一个适配器而不是数据提供者,这里就跟我们平时使用电源适配器一样,不是直接接入用手机接入直流电,而是通过适配器获得电源
$dataPerviderObj = new CsvDataAdapter(array('name' => 'tlq', 'email' => 'hjq_tlq@163.com'));
$apiObj = new CsvApi($dataPerviderObj);
$apiObj->api();