面向接口编程可以不依赖具体的实现类,从而做到很好的业务隔离,这在需要改变业务内部实现时会变得方便。
比如下面这个例子,我们要实现一个搜索算法,来计算要搜索的值是否在数组中,以及索引值。
$arr = array(1,2,3,4,5,7,8);//已排序数组
$value = 2;
//对于已排序数组,我们可以用二分查找法
$search = new search(new binary());
$index = $search->find($arr,$value);
//而如果是未排序数组,我们可以用遍历查找法
$search = new search(new sequence());
$index = $search->find($arr,$value);
以下是接口代码
/*
* 搜索接口
*/
interface iSearch
{
public function find($arr,$value);
}
/*
* 顺序查找类
*/
class sequence implements iSearch
{
public function find($arr,$value){
$len = count($arr);
for($i=0;$i<$len;$i++){
if($arr[$i] == $value){
return $i;
}
}
return -1;
}
}
/*
* 二分法查找类
*/
class binary implements iSearch
{
public function find($arr,$value){
$left = 0;
$right = count($arr) -1;
while($left<=$right){
$index = intval(($right + $left)/2);
if($arr[$index] == $value)
{
return $index;
}
if($arr[$index]<$value)
{
$left = $index + 1;continue;
}
if($arr[$index]>$value)
{
$right = $index - 1;
}
}
return -1;
}
}
/*
* 客户端搜索类
*/
class search{
protected $obj;
function __Construct(iSearch $obj){
$this->obj = $obj;
}
public function find($arr,$value){
return $this->obj->find($arr,$value);
}
}