什么是適配器(Adapter)?
顧名思義就是為了配合你新的需求把某個東西調配成合適你用的東西,就是適配器,是個人的解釋哈。
那么對象適配器與類適配器兩者有什么區別?
通過下面舉例子來說明。
【鳥】
/ \
【雞】 【鷹】
上面這個圖是我隨便畫的哈,懶得用畫圖了。
解釋下,就是,有鳥這種基類,然后雞和鷹分別是它的子類。
雞和鷹繼承了鳥...擁有鳥的基本特征。
那么在不破壞原有設計的基礎上想讓雞和鷹都擁有鳴叫的功能怎么辦??
記住前提是不破壞原來的設計,所以你不要告訴我在鳥那里添加個抽象方法然后下面繼承去重寫
那怎么辦呢?這個時候適配器出現鳥。
我們可以在下面搞多個類適配器(就是類)繼承雞和鷹呀。
如下: 【鳥】
/ \
【雞】 【鷹】
| |
【雞的適配器】 【鷹的適配器】
類適配器就是繼承他們父類的一個類啦,然后在適配器里面添加鳴叫的方法或者繼承一個有鳴叫功能的接口。
這就滿足我們的需求啦,我們的要求也搞定了,但是想想不對啊,如果有很多個動物,比如鴨,鵝,神馬的...
他們也要有鳴叫的功能,那是不是要創建很多個適配器啊,天啊...
於是乎,對象適配器就來鳥。
什么是對象適配器??看招,看下圖
【鳥】 【鳴叫接口】
/ | \ |
【雞】 【鷹】【鳥的適配器】
鳥的適配器依賴於鳥...看清楚我畫的是\紅色的,這貨不是繼承,只是剛好有鳥的所有字段和方法,然后它再繼承鳴叫的接口
於是它就有鳴叫的功能鳥。
接下來,見證奇跡的時候到了。該寫代碼鳥,不能偷懶。
1 public class BirdAdapter : ISay 2 { 3 private Bird _bird; 4 public BirdAdapter(Bird bird) 5 { 6 _bird=bird; 7 } 8 public void Tosay() 9 { 10 //不同動物實現不同的叫法。。。 11 } 12 } 13 14 --------- 15 main() //我簡略的寫,表示是主方法 16 { 17 BirdAdapter ba=new BirdAdapter(new Chicken()); 18 ba.Tosay(); 19 }
ISay是一個接口,實現鳴叫功能的哦。。。上面沒有寫。。
基本講完鳥,順便講下,很多人看到 Bird bird=new Chicken();
不明白有何用意,或者這樣會有什么結果。
這里有2個原則,就是關注對象原則,還有執行就行原則。
就是,如果bird.調用一個子類和父類相同名字的方法的時候,到底是執行是哪一個的方法呢?
取決於創建對象的是子類還是父類對象。