适配器是用于已有类,而不想改动的情况下更换接口。该模式与装饰器模式很像,但应用目的不同。
本篇例子:
美国电器电压是110V,中国是220V,你在美国想要使用中国的电器,就要有一个适配器将110V转为220V,不然电器无法使用。(emmm,怎么念起来怪怪的,但是我又没有证据)
第一种方式:对象适配器
interface Target
{
public function volt110();
public function other();
public function volt220();
}
/**
* Class Adaptee 被适配者
*/
class Adaptee
{
public function volt110()
{
echo '110V<br>';
}
public function other()
{
echo '我是其它操作<br>';
}
}
/**
* Class Adapter 适配器
*/
class Adapter implements Target
{
private $_adaptee;
public function __construct(Adaptee $adaptee)
{
$this->_adaptee = $adaptee;
}
public function volt110()
{
$this->_adaptee->volt110();
}
public function other()
{
$this->_adaptee->other();
}
public function volt220()
{
echo '220V<br>';
}
}
$adapter = new Adapter(new Adaptee());
$adapter->volt110(); // 想用110V就用110V,该类(Adaptee)在系统已存在并大规模使用了,修改它的逻辑判断与传参,可能会导致某些地方异常。
$adapter->volt220(); // 想用220V就增加22OV,在需要增加新的同类型操作时,但处理的数据不同,增加一个接口,再用适配器类(Adapter)实现该接口。使他们为同一个接口。
$adapter->other(); // 假装有其它操作
这样就可以调用同一个接口了。
不这么做,你就需要在Adaptee
类之外再建一个220V的类(Adapter
),用的时候再new。而现在,你只需要把之前的加到新建的接口中,就可统一调用。
总的来说,就是把新的类(方法本来就可以放同个类里)用接口规范了命名,使要增加的类组成一个接口,统一调用。
第二种方式:类适配器。能够更好的理解上面的说法
interface Target2
{
public function volt110();
public function volt220();
}
class Adaptee2
{
public function volt110()
{
echo '110V<br>';
}
public function other()
{
echo '我是其它操作<br>';
}
}
class Adapter2 extends Adaptee2 implements Target2
{
public function volt220()
{
echo '220V<br>';
}
}
$adapter2 = new Adapter2();
$adapter2->volt110();
$adapter2->volt220();
$adapter2->other();