閱讀953 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Design Pattern: Adapter 模式 - Object Adapter

  學習是分享和合作式的!

轉載請注明出處:https://blog.csdn.net/wdzxl198/article/details/9344903

文章摘自: https://www.riabook.cn/doc/designpattern/

的電腦是個舊電腦,新的滑鼠都在使用USB接口了,而您的電腦上並沒有USB,而隻有一個PS2接口,這時您可以使用一個USB轉PS2的接頭作為轉換,這樣您的電腦就可以使用新滑鼠了(當然您也可以使用USB擴充卡,意思是相同的)。
類似的概念,有時候您想在原來的程式中加入一個外部元件,例如一個類別,但是這個類別與您目前所設計的程式在介麵上並不一致,為了讓這個外部類與原程式的介麵一致,您必須使用一個類別作為中介來配接它們,這時您可以采用Adapter模式。
舉個例子來說,在Java 1.0中有個Enumeration,您在這個版本發行之後,使用它來設計了一個MessageApplication,例如:

  • MessageApplication.java
import java.util.*;

public class MessageApplication {
    public void showAllMessage(Enumeration enum) {
        Object msg;
        while(enum.hasMoreElements()) { 
            msg = enum.nextElement();
            System.out.println(msg);
        }
    }     
}

您的客戶端程式是這麼使用MessageApplication的:
  • MessageClient.java
import java.util.*;

public class MessageClient {
    private MessageApplication msgApp;

    public void run() {
        Vector vector = new Vector();
        for(int i = 0; i < 10; i++)
            vector.addElement("物件 " + i);
        
        msgApp = new MessageApplication();
        msgApp.showAllMessage(vector.elements());
    }
    
    public static void main(String[] args) {
        MessageClient msgClient = new MessageClient();
        msgClient.run();
    }
} 

現在Java 1.2中新增了Iterator,您想要使用它的功能,但基本上您不想更動原來程式中已設計好的MessageApplication類別,這時候您可以 使用Adapter模式,將Iterator的介麵轉換為Enumeration相容,例如:
  • IteratorAdapter.java
import java.util.*;

public class IteratorAdapter implements Enumeration {
    private Iterator iterator;

    IteratorAdapter(Iterator iterator) {
        this.iterator = iterator;   
    }

    // 轉接介麵
    public boolean hasMoreElements() {
        return iterator.hasNext();
    }

    public Object nextElement() 
                        throws NoSuchElementException {
        return iterator.next();
    } 
} 

您可以在客戶端程式中照樣使用MessageApplication類別,而不用作任何的變動:
  • MessageClient.java
import java.util.*;

public class MessageClient {
    // We could still use MessageApplication
    private Enumeration iteratorAdapter;
    
    public void run() {
        List arrayList = new ArrayList();

        for(int i = 0; i < 10; i++)
            arrayList.add("物件 " + i);
        
        iteratorAdapter = 
               new IteratorAdapter(arrayList.iterator());
        // We could still use MessageApplication
        MessageApplication msgApp = new MessageApplication();       
        msgApp.showAllMessage(iteratorAdapter);
    }

    public static void main(String[] args) {
        MessageClient msgClient = new MessageClient();
        msgClient.run();
    }
} 

如程式所示的,透過Adapter模式,您原有程式中已設計好的類別不用更動,就可以引進新類別的功能,將上麵的程式UML類別結構畫出如下:

Adapter

上麵的作法,是將要引進的新類別當作Adapter類別的一個物件成員,這是IbObject Adapter模式,其抽象結構如下:

Adapter

Edit by Atlas,

Time:15:34

最後更新:2017-04-03 16:48:36

  上一篇:go Just Do It!
  下一篇:go Android 動態logo bootanimation.zip 製作