1. 程式人生 > >介面卡模式:揭祕措不及防需求變化的補救措施

介面卡模式:揭祕措不及防需求變化的補救措施

目錄

概述與模型

1、概述

  含義:將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。

  說明:這是一種補救措施,在最開始設計的時候不建議使用這種設計模式。

  分類:類介面卡、物件介面卡。類介面卡就是採用繼承的方式,物件介面卡採用組合的方式,源於Java裡面只支援單繼承,所以此處只實現物件介面卡。

2、模型

  

應用場景描述

場景描述:假設我需要在我的膝上型電腦上接入鍵盤,我這個鍵盤比較奇葩,不是USB介面的,是圓孔的。而且,我們這裡還沒有USB的賣,而且現在10000個程式設計師需要鍵盤,這種突發狀況也很少見啊,很可能成為常態,我們又不可能去改變原來的設計結構,我們該怎麼辦?使用者需求(使用鍵盤,我才不管怎麼解決呢?)-->呼叫Adapter(轉換器)-->Adaptee(圓孔線鍵盤)。而正常情況下是,使用者需求(使用鍵盤)-->Adaptee(USB介面鍵盤)。我們來看實現。

介面卡模式實現

1、目標物件

public interface Target {
    public void request();
}

2、介面卡

public class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        System.out.println("新增一個介面卡給adaptee");
        adaptee.specialRequest();
    }

}

3、被適配者

public class Adaptee {
    public void specialRequest(){
        System.out.println("接入鍵盤!");
    }
}

4、客戶端測試

public class Client {
    public static void main(String [] args){
        //流程:程式設計師-->使用(request)-->介面卡(Adapter)-->鍵盤(Adaptee)
        Target coder=new Adapter(new Adaptee());
        //我要使用鍵盤
        coder.request();
    }
}

5、測試結果

再進一步

1、介面卡模式是什麼?介面卡模式有什麼用?

  將一個類的介面,轉換成客戶需要的介面。也就是說,使用者只關心介面(Target),並不關心你內部的實現,而當有特殊需求的時候,我們只需要不斷的新增介面卡就行,並不用關心其他的。

  這是一種補救措施,最初設計不夠完善的解決方案。

2、真實世界的介面卡

  IO中:InputStream-->FileInputstream-->File:最初IO肯定就是隻是處理流,而不處理其他的。而隨著變化,現在需求是,我要讀取二進位制流(二進位制檔案)。那麼InputStream無法改變,使用者需求無法改變,我們只能新增介面卡來解決,從而就演變出FileInputStream、DataInputStream來充當介面卡角色,可能以後還會出現各種處理流物件的介面卡待你去解決呢。關於IO的整體處理細節參考我的裝飾者模式:http://www.cnblogs.com/qiuyong/p/6538856.html

  InputStream-Target  is=new FileInputStream-Adapter (new File()-Adaptee);

  is.read(); 

  通過上述描述你可能已經知道介面卡模式的作用了,不妨自己也造一個關於介面卡模式的運用場景?

  比如,迭代器(Target)-->列舉類介面卡-->處理hasNext()、...

public class EnumrationIterator implements Iterator{

    Enumeration enumeration;
    public EnumrationIterator(Enumeration enumeration) {
        this.enumeration=enumeration;
    }

    public boolean hasNext() {
        return (boolean)enumeration.hasMoreElements();
    }

    public Object next() {
        return enumeration.nextElement();
    }

    public void remove() {
        throw  new UnsupportedOperationException();
    }
}