PHP设计模式之适配器模式
1、适配器模式的概念
适配器设计模式只是将某个对象的接口适配为另一个对象所期待的接口。
2、UML静态模型
3、单例模式举例
今天从网络上爬了一些数据,爬下来的内容如下表格所示,该内容在另一页面直接显示,这里的爬虫代码就不写了,只写一个模拟的效果。
address |
山东威海农副产品批发市场 |
甘肃靖远瓜果蔬菜批发市场 |
河南南阳果品批发交易中心 |
安徽亳州蔬菜批发市场 |
江苏无锡朝阳农贸市场 |
1、得到数据代码如下所示:文件名Datas.php
<?php
class Datas{
protected $_data;
function __construct(){
$this->_data = array(
'山东威海农副产品批发市场',
'甘肃靖远瓜果蔬菜批发市场',
'河南南阳果品批发交易中心',
'安徽亳州蔬菜批发市场',
'江苏无锡朝阳农贸市场'
);
}
public function get(){
return $this->_data;
}
}
class Datas{
protected $_data;
function __construct(){
$this->_data = array(
'山东威海农副产品批发市场',
'甘肃靖远瓜果蔬菜批发市场',
'河南南阳果品批发交易中心',
'安徽亳州蔬菜批发市场',
'江苏无锡朝阳农贸市场'
);
}
public function get(){
return $this->_data;
}
}
2、显示数据代码如下所示:文件名shows.php
<?php
header('content-type:text/html;charset=gb2312');
require_once 'Datas.php';
$datas = new Datas();
$data = $datas->get();
foreach ($data as $value){
echo $value."<br>";
}
header('content-type:text/html;charset=gb2312');
require_once 'Datas.php';
$datas = new Datas();
$data = $datas->get();
foreach ($data as $value){
echo $value."<br>";
}
现在,我要把数据存到数据库,由于获取到的数据的前两个字是地区名,所以在数据库存取时要求将该条记录的地区名也存进去,也就是截取一下前两个汉字即可。现在应该怎么办?重新在这个类中写一个方法?尽量不要这样,因为这个类在别的页面中应用,所以就尽量不要更改这个类了,以免引出其他错误,现在就是写一个适配器,返回的数据就是地区名+市场名的数据格式。
3、适配器代码如下:DatasAdapter.php
<?php
require_once 'Datas.php';
class DatasApapter extends Datas{
function __construct(){
parent::__construct(); //父对象实例化,获取到的数据存在父对象
}
function get(){
$data = array();
foreach (parent::get() as $value){ //调用父对象的get获取到数据 因为父类中的get()为获取原始数据,重用父类方法,在子类的方法在只是适配一下数据而已。
$data[] = array(
'region' => mb_substr($value,0,2,'GB2312'),
'market' => $value
);
}
return $data;
}
}
require_once 'Datas.php';
class DatasApapter extends Datas{
function __construct(){
parent::__construct(); //父对象实例化,获取到的数据存在父对象
}
function get(){
$data = array();
foreach (parent::get() as $value){ //调用父对象的get获取到数据 因为父类中的get()为获取原始数据,重用父类方法,在子类的方法在只是适配一下数据而已。
$data[] = array(
'region' => mb_substr($value,0,2,'GB2312'),
'market' => $value
);
}
return $data;
}
}
4、使用适配器代码如下:db.php
<?php
header('content-type:text/html;charset=gb2312');
require_once 'DatasAdapter.php';
$obj = new DatasApapter();
$data = $obj->get();
foreach ($data as $value){
foreach ($value as $k => $v)
echo $k."=>".$v;
echo "<br>";
}
header('content-type:text/html;charset=gb2312');
require_once 'DatasAdapter.php';
$obj = new DatasApapter();
$data = $obj->get();
foreach ($data as $value){
foreach ($value as $k => $v)
echo $k."=>".$v;
echo "<br>";
}
4、结论
在开发过程中,如果需求发生了改变,不要急于去重新写该部分的代码,因为该需求只变了一部分,其他功能可能还用到原先的代码了,若去重写该代码,考虑不周的话可能会在其他功能出错,所以最好的实践就是去创建一个适配器,将原先的接口适配成现在所需要的接口,这样一来,不仅可以重用之前写的代码,并且能减少很多麻烦。