淺談Java介面卡模式
假期剛結束不久,也沒什麼好寫的,今天就水下文章,講講設計模式對開發時的影響,做開發到現在,感覺設計模式對開發的影響還是挺大的。
這次就簡單談談介面卡模式。可能介面卡模式感覺比較雞肋,但是用到的地方還挺多的,特別是合作開發的時候。
1.介面卡模式
介面卡模式,作為連線兩個介面的橋樑。這個概念感覺有點那啥,很少用介面的朋友可能就沒有什麼感覺,經常面向介面程式設計的朋友比較能產生共鳴,簡單來說,就是寫一個介面卡(轉換器)來對接物件。
2.介面卡模式使用
java介面卡模式有兩種,類介面卡和物件介面卡
(1)類介面卡demo
類介面卡主要是使用繼承的方式連線兩個介面。我們假設對接介面A和介面B。
先寫介面B
public interface MP4{ void play(); }
介面B的實現類
public class ExpensiveMP4 implement MP4{ public void play(){ // todo } }
介面A
public interface Player{ void action(); }
假如你的工程中有這幾個類,然後你發現,action()方法中要寫的操作,就是ExpensiveMP4的play()中的操作“//todo”,所以你沒必要重複再寫一次,想個辦法讓他們適配。所以,你想讓外部呼叫Player的時候去呼叫ExpensiveMP4的play,如果用類介面卡的話可以這樣寫
public class ExpensiveAdapter extends ExpensiveMP4 implement Player{ public void action(){ play(); } }
這樣就把兩個介面連線起來了,不過我一般用不上類介面卡,感覺這樣的做法不太靈活,而且在java中,儘量少用繼承,多用組合。而且這種寫法我覺得也不太舒服。
(2)物件介面卡demo
上面的類介面卡用的是“繼承”的方式去連線,這裡的物件介面卡用的是“組合”的方式。我們假設對接介面A和介面B。就用上面的MP4介面,Player介面和ExpensiveMP4類吧。
這時候我們使用物件介面卡的話可以這樣寫。
public class PlayerAdapter implement Player{ public ExpensiveMP4 expensiveMP4; public PlayerAdapter (){ this.expensiveMP4 = new ExpensiveMP4(); } public void action(){ if(expensiveMP4!= null){ expensiveMP4 .play(); } } }
感覺這樣好像不太靈活,expensiveMP4像死的一樣,毫無靈魂,好吧,我們改改。
public class PlayerAdapter implement Player{ public ExpensiveMP4 expensiveMP4; public PlayerAdapter (ExpensiveMP4 expensiveMP4){ this.expensiveMP4 = expensiveMP4; } public void action(){ if(expensiveMP4!= null){ expensiveMP4 .play(); } } }
這樣就比剛才好多了,比剛才的程式碼靈活多了,但是總感覺有點普通,我們要把程式碼寫得有點藝術,抽象就是藝術,好吧,再改改。
public class PlayerAdapter implement Player{ public MP4 mp4; public PlayerAdapter (MP4 mp4){ this.mp4 = mp4; } public void action(){ if(mp4!= null){ mp4.play(); } } }
可能這樣看起來會比較好一點吧,比較容易看出如何適配兩個介面。
3.介面卡模式的使用場景
(1)其中一個使用的場景是像上面所說的一樣,有兩個介面,你主動的想去連線著兩個介面,寫個介面卡,感覺這種情況也不是很多,因為很多時候都是些一個實體類物件呼叫另一個實體類物件。
(2)被動使用的情況,這種情況我可能見得比較多。舉個栗子,比較極端的栗子,你和你同伴一起合作開發,你同伴寫一個部分,你寫一個部分,現在兩個部分要對接。結過到對接時,你們發現兩個人都自定義了介面,而且兩個人都開發完了,都不想改,那怎麼辦,只能寫一個介面卡去適配兩個介面。又或者說你開發新版本的時候重新定義了介面,要和舊版本寫適配的時候,為了方便也可以使用介面卡模式。