適配器模式, 也叫做Adapter模式,他的完整定義是:
將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作。
在生活中也有一些適配器的實例,比如說我們的插座,一般我們的插座是兩孔的,但是有些大功率的電器比如空調啊,冰箱之類的,他們就是三孔的。而爲了使兩孔三孔都能夠正常的使用,所以我們的插座一般都有三孔的實現。但是電線我們都知道是由正負兩根線組成,所以說三孔插座也只是兩孔有用而已。這就是典型的適配器。
在軟件學中的適配器,其實有一下三種角色:
1. 目標接口(Target): 也就是客戶所期待的接口,可以是具體的或者抽象類,也可以是接口。
2. 需要適配的類: 通常是與目標接口不相同的類,比如上面例子中的空調插線。
3. 適配器類: 通過包裝一個需要適配的對象,將願接口轉換成目標接口。
在講解適配器模式的具體實現時,我們先來看看適配器模式的UML圖:
具體的實現代碼如下:
//目標接口,只接受正負兩極
abstract class Target{
abstract function doubleHole();
}
//空調類,被適配者
class AirCondition {
//有一個可以插入三個插孔的方法
public function threeHole(){
echo "我通電了";
}
}
//適配器類
class Adapter extends Target{
public $aircondition;
public function __construct(){
$this->aircondition = new Aircondition();
}
public function doubleHole(){
$this->aircondition->threeHole();
}
}
在上面的代碼中,首先有一個target類,該類就是目標接口,他只接受兩孔插頭,然後定義了一個空調的類,空調的插頭是三個,所以我們不能直接的去實現,這就需要一個適配器類去給我們進行一個適配。在適配器中,必須要持有空調對象的引用,然後去繼承或者實現Target。通過代碼我們可以看到,在doubleHole()方法裏面去直接調用aircondition的 threeHole方法,這樣就將空調的三孔插孔給匹配上了。這就是適配器模式的實現方式。
總結:其實適配器在使用的時候多少有點亡羊補牢的感覺,因爲無法更改現有的代碼而做出的一個無奈之舉。因爲在軟件的設計過程中,我們如果有能力去改變類的行爲,那麼就應該使其與接口匹配,但是在是無法改變其行爲的時候(比如說引入的第三方庫),那麼就可以使用適配器模式進行一個適配的過程。