软件设计模式之适配器模式(JAVA)
什么是適配器模式?
在計(jì)算機(jī)編程中,適配器模式(有時(shí)候也稱包裝樣式或者包裝)將一個(gè)類的接口適配成用戶所期待的。適配器能將因?yàn)榻涌诓患嫒荻荒茉谝黄鸸ぷ鞯念惞ぷ髟谝黄?#xff0c;做法是將類自己的接口包裹在一個(gè)已存在的類中。
?
實(shí)現(xiàn)適配器的方式?
①對(duì)象適配器模式 -- 在這種適配器模式中,適配器容納一個(gè)它包裹的類的實(shí)例。在這種情況下,適配器調(diào)用被包裹對(duì)象的物理實(shí)體。 ②類適配器模式 -- 這種適配器模式下,適配器繼承自已實(shí)現(xiàn)的類(一般多重繼承)。 理論性的東西看起來就是比較煩,下面來舉個(gè)日常的小例子來更好的了解適配器吧 圖1:三相插頭 圖2:二孔插座 圖3:三相插頭轉(zhuǎn)二相的轉(zhuǎn)換器 看完上面三幅圖,我想大家應(yīng)該都一目了然了,想把三相插頭插到二孔插座里,只能中間加個(gè)轉(zhuǎn)換器,這里我們可以簡單把它理解成我們今天要說的適配器 再回過頭看看文章開始的這句話"適配器能將因?yàn)榻涌诓患嫒荻荒茉谝黄鸸ぷ鞯念惞ぷ髟谝黄?#34;,沒錯(cuò),在兩個(gè)原本不能工作到一起的組件中間添加適配器,就可以把它們關(guān)聯(lián)起來了。 適配器模式里面存在著3種角色: 1、目標(biāo)角色(Target):也就是客戶理想中想要的接口,比如三相插頭,客戶想找的插孔就是三孔插座(目標(biāo)角色)。 2、源(Adatee):現(xiàn)有的接口,也就是不滿足客戶想要的接口,也就是這個(gè)二孔插座(源)。 3、適配器(Adapter):能將二孔插座轉(zhuǎn)換成"三孔插座"的組件,也就是上圖的三相插頭轉(zhuǎn)二相插頭轉(zhuǎn)化器(適配器)。 就以上面的例子,用代碼來講下適配器模式吧 首先先來說下對(duì)象適配器模式以筆記本通電為例,大家都知道正常的筆記本電源是三相接口 ThreeSocket.java 這是一個(gè)需求接口,也就是客戶期待的,也就是3種角色中的目標(biāo)接口(Target) 1 package com.lcw.adapter.test; 2 3 public interface ThreeSocket { 4 5 //需要一個(gè)三孔插座,也就是客戶的需求 6 public void needThreeSocket(); 7 8 }
?
TwoSocket.java
這是現(xiàn)有的組件,也就是那個(gè)二孔插座,也就是3種角色中的源(Adatee),雖然能通電,但接口是不滿足客戶的需要
1 package com.lcw.adapter.test; 2 3 public class TwoSocket { 4 // 現(xiàn)有的插座,只有二孔,已經(jīng)有了供電功能,只是缺少了三孔接口 5 public void serverTwo() { 6 System.out.println("我是一個(gè)二孔插座,我有供電功能"); 7 } 8 9 }?
ThreeToTwoAdapter.java
這是適配器類,它需要2孔插座來提供電,并實(shí)現(xiàn)三孔插座,在構(gòu)造方法中傳入現(xiàn)有組件2孔插座的對(duì)象(帶電)
1 package com.lcw.adapter.test; 2 3 public class ThreeToTwoAdapter implements ThreeSocket{ 4 private TwoSocket socket; 5 public ThreeToTwoAdapter(TwoSocket two) { 6 this.socket=two; 7 } 8 //現(xiàn)在已經(jīng)有2孔插座的對(duì)象(意味著有通電功能) 9 @Override 10 public void needThreeSocket() { 11 socket.serverTwo(); 12 System.out.println("二孔接口已轉(zhuǎn)換成三孔接口,并注入電"); 13 } 14 15 }這樣一來,適配器類這個(gè)中間類就有了源(二孔插座)的效果也就是"電"
然后再實(shí)現(xiàn)了目標(biāo)接口方法,也就是開通了三相接口,把"電"注入,這樣就可以把2個(gè)本無法一起工作的類聚集到一起,類似紅娘在它們之間牽了一條關(guān)系線
?
Computer.java 筆記本類,它需要的是三孔接口
1 package com.lcw.adapter.test; 2 3 public class Computer { 4 //筆記本電腦的電源插頭需求是3孔 5 private ThreeSocket three; 6 public Computer(ThreeSocket three){ 7 this.three=three; 8 } 9 public void server(){ 10 System.out.println("筆記本通電成功!"); 11 } 12 13 }?
來寫個(gè)測試類
1 package com.lcw.adapter.test; 2 3 public class Test { 4 public static void main(String[] args) { 5 //現(xiàn)有插座兩孔,已經(jīng)有提供電的功能,只是缺少3孔接口 6 TwoSocket two=new TwoSocket(); 7 //把具有通電功能的對(duì)象傳遞進(jìn)去,目的是要開通3孔接口的通電功能 8 ThreeSocket three=new ThreeToTwoAdapter(two); 9 //得到一個(gè)滿足筆記本電源接口且具有電的功能對(duì)象 10 Computer computer=new Computer(three); 11 three.needThreeSocket(); 12 computer.server(); 13 } 14 }看下效果圖:
好了,這樣就把2個(gè)原本不能在一起工作的類鏈接到一起了。
?
接著來說下類適配器模式
類適配器顧名思義不同點(diǎn)在于適配器,既然突出了'類",我們一般都會(huì)聯(lián)想到繼承
嗯,沒錯(cuò),類適配器的做法就是讓適配器去繼承已有功能(二孔插座)的類,然后再實(shí)現(xiàn)期望接口(三孔插座)
具體看代碼吧,除了測試類和適配器類,其他的類與上面的保持一致,這里就不再貼出
ThreeToTwoExtendsAdapter.java(適配器類)
1 package com.lcw.adapter.test; 2 3 public class ThreeToTwoExtendsAdapter extends TwoSocket implements ThreeSocket{ 4 public void needThreeSocket() { 5 this.serverTwo(); 6 System.out.println("二孔接口已轉(zhuǎn)換成三孔接口"); 7 } 8 9 }Test.java(測試類)
1 package com.lcw.adapter.test; 2 3 public class Test { 4 public static void main(String[] args) { 5 //由于ThreeToTwoExtendsAdapter繼承了源,所以具有源的功能(電),并實(shí)現(xiàn)了3孔接口 6 ThreeSocket socket=new ThreeToTwoExtendsAdapter(); 7 //插入接口 8 Computer computer=new Computer(socket); 9 socket.needThreeSocket(); 10 computer.server(); 11 12 } 13 }效果依舊:
?
?
總結(jié)下:
①對(duì)象適配模式:
把"被適配者"作為一個(gè)對(duì)象組合到適配器中,以修改目標(biāo)接口包裝被適配者。
(例如上面例子,二孔插座就是被適配者,把對(duì)象傳入適配器并實(shí)現(xiàn)接口方法改造)
?
②類適配模式:
通過多重繼承和實(shí)現(xiàn)接口的方式,單一的為某個(gè)類而實(shí)現(xiàn)適配。
?
適配器的作用?
1、透明:通過適配器客戶端可以調(diào)用統(tǒng)一接口,對(duì)于客戶端是透明的,這樣做可以更加簡潔, 直接,緊湊。
2、復(fù)用:復(fù)用了現(xiàn)存的類,解決因環(huán)境要求不一致的問題。
3、低耦合:將目標(biāo)類與源類解耦,引入一個(gè)適配器重用源類(適配器類),遵守開放-關(guān)閉原則。
?
作者:Balla_兔子
出處:http://www.cnblogs.com/lichenwei/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點(diǎn)了吧,相得準(zhǔn),我分文不收;相不準(zhǔn),你也好回來找我!
總結(jié)
以上是生活随笔為你收集整理的软件设计模式之适配器模式(JAVA)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到下雨预示着什么周公解梦
- 下一篇: 怀孕梦到捉鱼预示着什么