適配器設計模式

適配器模式主要解決是類與類之間接口不兼容情況,比如你又一個三口插座需要插入一個兩口插孔這個時候就需要適配器來做處理。適配器模式有兩種:類適配器、對象適配器、接口適配器。

類適配器模式

當我們要訪問的接口A中沒有我們想要的方法 ,卻在另一個接口B中發現了合適的方法,我們又不能改變訪問接口A,在這種情況下,我們可以定義一個適配器p來進行中轉,這個適配器p要實現我們訪問的接口A,這樣我們就能繼續訪問當前接口A中的方法(雖然它目前不是我們的菜),然后再繼承接口B的實現類BB,這樣我們可以在適配器P中訪問接口B的方法了,這時我們在適配器P中的接口A方法中直接引用BB中的合適方法,這樣就完成了一個簡單的類適配器。

class Test{
public interface Ps2 {
     void isPs2();
    }

public interface Usb {
        void isUsb();
     }
public class Usber implements Usb {

     @Override
     public void isUsb() {
         System.out.println("USB口");
     }
     }

public class Adapter extends Usber implements Ps2 {
 
     @Override
     public void isPs2() {
         isUsb();
     }
 
 }
  public class Clienter {
     public static void main(String[] args) {
         Ps2 p = new Adapter();
         p.isPs2();
     } 
 }

}

對象適配器模式

與上面的類似,但是adapter略有不同,但是類適配器模式是通過繼承來獲取方法,而對象適配器模式是通過構造器傳來一個對象從而獲取方法。

public class Adapter implements Ps2 {
      
      private Usb usb;
      public Adapter(Usb usb){
          this.usb = usb;
      }
      @Override
      public void isPs2() {
          usb.isUsb();
     }
 
 }

接口適配器模式

當存在這樣一個接口,其中定義了N多的方法,而我們現在卻只想使用其中的一個到幾個方法,如果我們直接實現接口,那么我們要對所有的方法進行實現,哪怕我們僅僅是對不需要的方法進行置空(只寫一對大括號,不做具體方法實現)也會導致這個類變得臃腫,調用也不方便,這時我們可以使用一個抽象類作為中間件,即適配器,用這個抽象類實現接口,而在抽象類中所有的方法都進行置空,那么我們在創建抽象類的繼承類,而且重寫我們需要使用的那幾個方法即可。

例子

比如安卓中ListView中的設計BaseAdapter其實實現的接口很多,但是你繼承BaseAdapter確只是實現四個方法,其他由BaseAdapter進行整合,這就是接口適配器。

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public boolean hasStableIds() {
        return false;
    }
    
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    
    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    /**
     * Notifies the attached observers that the underlying data is no longer valid
     * or available. Once invoked this adapter is no longer valid and should
     * not report further data set changes.
     */
    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }

    public boolean areAllItemsEnabled() {
        return true;
    }

    public boolean isEnabled(int position) {
        return true;
    }

    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return getView(position, convertView, parent);
    }

    public int getItemViewType(int position) {
        return 0;
    }

    public int getViewTypeCount() {
        return 1;
    }
    
    public boolean isEmpty() {
        return getCount() == 0;
    }
}

總結

在軟件工程中,適配器模式是一種軟件設計模式,它允許現有類的接口作為另一個接口使用。它通常用于使現有類與其他類協同工作而不修改源代碼。

優勢

  • 將目標類和適配者類解耦
  • 增加了類的透明性和復用性,將具體的實現封裝在適配者類中,對于客戶端類來說是透明的,而且提高了適配者的復用性
  • 靈活性和擴展性都非常好,符合開閉原則

缺點

  • 過多地使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。

  • 對于類適配器而言,由于 JAVA 至多繼承一個類,所以至多只能適配一個適配者類,而且目標類必須是抽象類

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容

  • 1、與晨媽相約給晨爸買了個手機,2個人還一起逛街 2、我說我在尋找生命的意義,你信嗎? 3、大風起兮云飛揚,哈哈,...
    寧靜的流星閱讀 256評論 0 0
  • 忙碌了一天下來,見了連個客戶,開了兩個會議,都是圍繞著自己產品能力的過程中展開的。但回顧其過程,卻發現事情做了很多...
    逄格亮閱讀 282評論 0 0
  • 李笑來老師現在是真紅,公眾號提了一下電影《萬箭穿心》,我估計無數的人都去看了,當然也包括我。前兩天關于《萬...
    惠東閱讀 348評論 0 0
  • 隨著時光的飛轉,我們在日益的長大,父母日益的年老。與父母相處,隨之而來也有不少碰撞于火花。我們要如何面對呢? ...
    四只喵閱讀 337評論 0 0
  • 細雨斜風,花褪殘紅。青杏微吐,乳燕新萌。抬望眼處,萬類菁菁。掩卷拋書,孰問前程?三十九載,南柯一夢!回首桑梓,所謂...
    照影驚鴻閱讀 398評論 2 1