一个人,想从一个地方到底另一个地方,可以通过走路,开车,或者骑自行车等等。
假设之前有一条乡间小路,之前因为路况不好,人们只能通过走路,或者骑自行车通过。于是开发者针对这条路,开发ITraffic这个接口,同时实现了 Walk,Bike这两个具体类,但随着经济的发展,这条路被修建改善,路完全可以通过车了。
本来开发者想通过ITtraffic去实现了Car这个实例。但发现,这个Car的类之前有其他的开发者实现。而且符合自己的需求。唯一的问题是,这个ITraffic 不是实现 ITraffic接口,而是ICar。那么问题来了,为了Car这个能被开发者直接使用,怎么办?而这就今天要解决的问题。
//小路未开发之前的接口
interface ITraffic{
public function run();
}
//走
class Walk implements ITraffic {
public function run() {
echo "<BR>BY Walk<BR>";
}
}
//自行车
class Bike implements ITraffic {
public function run() {
echo "<BR>BY Bike</BR>";
}
}
//路的通过方式
class Road {
public function through($object) {
$object->run();
}
}
多年之后路开发了,可以通车了。开发者发现了可复用的接口
//其他开发者开发的接口
interface ICar {
public function drive();
}
//这个具体类,符合当前开发者对车的需求。
class Car implements ICar {
public function drive(){
echo "<BR>BY Car<BR>";
}
}
让Car 能被 Road 像调用ITraffic的方式进行调用。
//为了让Car的调用能像ITraffic一样,适配Car
class AdapterCar implements ITraffic{
private $_car = null;
public function __construct($car) {
$this->_car = $car;
}
public function run() {
$this->_car->drive();
}
}
调用实例
$Road = new Road();
$Road->through(new Walk());
$Road->through(new Bike());
$Road->through(new AdapterCar(new Car()));
而这就是今天的主角--适配器模式
适配器(Adapter)模式的主要作用是:使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
这个模式,不应该是开发初要考虑的,开发初期我们应该考虑全面,开发出满足大部分需求的接口。
这个模式是在开发后期,发现想使用一个已经存在的类,而它的接口不符合你的需求。