前言:
適配器模式可以將一個類或接口應用于另一個不同但是卻有聯系的接口,主要的做法是通過聲明一個目標接口的實現類,在該類中聲明一個將被適配類或接口(被適配者)作為參數的構造器和被適配者的實例,這樣在實現目標接口的時候就可以調用被適配者的實例,并且輔以一些額外的操作。適配器模式的主體有三個部分:適配者,適配者實現類和被適配者。具體類結構如下圖:
這里將被適配者的對象以組合的方式放到適配器類中,那么被適配者及其實現者都可以使用該適配器。適配器模式的優點在于可以將不同類型但是工作目的相似的對象兼容起來,而缺點在于,如果目標接口較大,那么要進行兼容工作就需要許多額外的代碼。
這里以一個不太符合實際的例子來對適配器模式進行說明。火雞和鴨子都是可以叫并且飛的,但是火雞和鴨子的叫聲不一樣,并且火雞也沒有鴨子飛得遠。如果想把一只火雞假扮為一只鴨子,就需要將火雞對象進行一些裝扮,這里我們就可以聲明一個裝扮類,該裝扮類也是鴨子類型的一種,當火雞進入該裝扮之后就變成了一只鴨子。具體的類實現如下:
目標接口(鴨子接口):
1
2
3
4
|
public interface Duck { void quack(); void fly(); } |
目標接口的正常實現(鴨子實現):
1
2
3
4
5
6
7
8
9
10
11
|
public class MallardDuck implements Duck { @Override public void quack() { System.out.println( "Quack" ); } @Override public void fly() { System.out.println( "I'm flying" ); } } |
被適配者接口(火雞接口):
1
2
3
4
|
public interface Turkey { void gobble(); void fly(); } |
被適配者一般實現(火雞類):
1
2
3
4
5
6
7
8
9
10
11
|
public class WildTurkey implements Turkey { @Override public void gobble() { System.out.println( "Gobble gobble" ); } @Override public void fly() { System.out.println( "I'm flying a short distance" ); } } |
適配器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class TurkeyAdapter implements Duck { private Turkey turkey; public TurkeyAdapter(Turkey turkey) { this .turkey = turkey; } @Override public void quack() { turkey.gobble(); } @Override public void fly() { for ( int i = 0 ; i < 5 ; i++) { turkey.fly(); } } } |
通過火雞適配器,我們將火雞適配成了一只鴨子。這里需要說明的是,適配器模式與裝飾者模式都是對源對象進行裝飾,而達到一定的效果的,但是適配器模式和裝飾者模式的區別在于,適配器模式是適配源對象,使其能夠符合特定的接口,而裝飾者模式是對源對象的功能的一個擴充,使其能做更多的工作。
如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:https://my.oschina.net/zhangxufeng/blog/787160