Java设计模式 - 适配器模式
概述
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
構(gòu)造器模式
上面的概述可能不是太容易理解,下面舉一個(gè)例子說明適配器模式的應(yīng)用。
大家都知道,新款iPhone 7手機(jī)使用了扁口的Lightning接口耳機(jī)插槽,而舊款的3.5mm普通耳機(jī)是否就不能使用了呢?其實(shí)不然,iPhone 7配件中隨機(jī)附贈(zèng)了一個(gè)小玩意,可直接將普通3.5mm耳機(jī)轉(zhuǎn)換為iPhone 7可使用的耳機(jī)。
而這個(gè)小配件就是一個(gè)適配器Adapter,iPhone 7就是目標(biāo)接口Target,而普通的3.5mm耳機(jī)就是待適配者Adaptee。
轉(zhuǎn)接頭 - Adapter3.5mm耳機(jī) - AdapteeiPhone 7 - Target再如,市面上出售的安卓數(shù)據(jù)線轉(zhuǎn)iPhone Lightning接口的轉(zhuǎn)換器,都可以被認(rèn)為是一個(gè)Adapter,類似例子比比皆是。
其實(shí),適配器模式的核心,就是使得接口完全不相干的兩個(gè)類可以協(xié)同工作。
1、類的適配器模式
/*** 帶有l(wèi)ightning耳機(jī)接口的iPhone7 [Target - 目標(biāo)接口]*/ public interface IPhone7 {void listenWithLightning(); } /*** 普通3.5mm耳機(jī) [Adaptee - 待適配者]*/ public abstract class Headphone {public abstract void listenWithCommon(); } /*** lightning to 3.5mm耳機(jī) 轉(zhuǎn)換器 [Adapter - 適配器]*/ public class HeadphoneAdapter extends Headphone implements IPhone7 {public void listenWithLightning() {}public void listenWithCommon() {} }HeadphoneAdapter 通過繼承一個(gè)類,然后實(shí)現(xiàn)一個(gè)新的接口,完成了 Headphone 與 IPhone7的兼容。
像上面這個(gè)結(jié)構(gòu),在Java開發(fā)中非常常見,這屬于類的適配器模式。
2、對象的適配器模式
還有一種基于對象的適配器模式,即對象的適配器模式。
將上面的 HeadphoneAdapter 類做如下修改:
/*** lightning to 3.5mm耳機(jī) 轉(zhuǎn)換器 [Adapter - 適配器]*/ public class HeadphoneAdapter implements IPhone7 {private Headphone headphone;public HeadphoneAdapter(Headphone headphone) {this.headphone = headphone;}public void listenWithLightning() {}public void listenWithCommon() {headphone.listenWithCommon();} }此時(shí),HeadphoneAdapter 要將 Headphone 適配為 iPhone 7 可識別的耳機(jī),直接持有該類的實(shí)例,調(diào)用該類的 listenWithCommon() 方法即可。 此為對象的適配器模式。
3、接口的適配器模式
適配器模式中的第三種模式也非常常見——接口的適配器模式。
當(dāng)不希望實(shí)現(xiàn)一個(gè)接口中所有的方法時(shí),可以創(chuàng)建一個(gè)抽象類繼承該接口,并實(shí)現(xiàn)空方法或默認(rèn)方法,子類只需繼承該抽象類即可。
/*** 抽象適配器類*/ public abstract class Adapter extends Headphone implements IPhone7 {public void listenWithLightning() {} } /*** 具體適配器類*/ public class HeadphoneAdapter extends Adapter {public void listenWithCommon() {} }可以看到,HeadphoneAdapter 無需實(shí)現(xiàn) listenWithLightning() 方法,該方法已由父類 Adapter 做了默認(rèn)空實(shí)現(xiàn)。
Android中的適配器模式
public interface ListAdapter extends Adapter {//... } public interface SpinnerAdapter extends Adapter {//... } public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {//... }BaseAdapter 既實(shí)現(xiàn)了 ListView 的功能,也實(shí)現(xiàn)了 Spinner 的功能。
作者:Fynn_
鏈接:https://www.jianshu.com/p/3b1b7812aeea
來源:簡書
總結(jié)
以上是生活随笔為你收集整理的Java设计模式 - 适配器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说说 JAVA 代理模式
- 下一篇: 适配器模式原理及实例介绍