适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
意图: 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
关键代码: 适配器继承或依赖已有的对象,实现想要的目标接口。
/**
* Map接口
*/
interface MapInterface {
public function search(); //查找
public function locat(); //定位
public function direct(); //路线规划
}
/**
* MyMap 自定义map实现
*/
class MyMap implements MapInterface{
public function search() {
echo "mymap search\n";
}
public function locat() {}
public function direct() {}
}
/**
* BaiduMap 引入扩展的第三方BaiduMap
*/
class BaiduMap {
public function baiduSearch() {
echo "baidu search\n";
}
public function baiduLocat() {}
public function baiduDirect() {}
}
/**
* GooleMap 引入扩展的第三方GoogleMap
*/
class GoogleMap {
public function googleSearch() {
echo "google search\n";
}
public function googleLocat() {}
public function googleDirect() {}
}
/**
* 适配器类
*/
class MapAdapter implements MapInterface {
private $map;
public function __construct($map) {
$this->map = $map;
}
public function search() {
if ($this->map instanceof BaiduMap) {
$this->map->baiduSearch();
} elseif ($this->map instanceof GoogleMap) {
$this->map->googleSearch();
} else {
$this->map->search();
}
}
public function locat() {
}
public function direct() {
}
}
/**
* 客户端
*/
class Client {
//@var MapInterface
protected $map;
public function __construct(MapInterface $map) {
$this->map = $map;
}
public function setMap(MapInterface $map) {
$this->map = $map;
}
public function find() {
$this->map->search();
}
public function getLocation() {
$this->map->locat();
}
}
//客户端不需要修改业务代码调用map的逻辑,只需要自行选择切换map实例就好
$client = (new Client(new MyMap()))->find();
$client = (new Client(new MapAdapter(new BaiduMap())))->find();
网友评论