標籤:style blog http color io os 使用 java ar
適配器模式定義:將一個類的介面,轉換成客戶期望的另一個介面。適配器讓原本介面不相容的類可以合作無間。
我們首先需要明白什麼是適配器,如是電源插座適配器。通過這一個適配器可以讓三孔插座“插到”二孔插座上。而在實際編碼中,如果兩個介面之間能搭配使用,第一種方法就是改變其中一方的源碼,但是很多時候這需要很大的工作量,這是我們可以在這兩個介面之間加一個適配器,這樣就可以相對來說用較少的人力、物力消耗來達到同樣的效果。
舉個例子來說:在Java早期的集合類型中都實現了一個elements()方法,該方法會返回一個Enumeration類型,Enumeration介面中定義了兩個方法hasMoreElements()和nextElements(),用來對集合中的元素進行遍曆。而在Sum公司推出新的集合類之後,開始使用Iterator介面來對集合中的元素進行遍曆,如果某個方法只支援Iterator,不支援Enumeration,那麼就可以在這裡定義一個適配器,來進行中間轉換。
具體代碼如下:
定義一個Enumeration2Iterator的類用來將Enumeration轉換成Iterator。
1 /** 2 * Enumeration 到 Iterator的適配器 3 * @author Apache_xiaochao 4 * 5 * @param <E> 6 */ 7 public class Enumeration2Iterator<E> implements Iterator<E> { 8 9 private Enumeration<E> enumeration;10 11 public Enumeration2Iterator(Enumeration<E> enumeration) {12 super();13 this.enumeration = enumeration;14 }15 16 @Override17 public boolean hasNext() {18 return enumeration.hasMoreElements();19 }20 21 @Override22 public E next() {23 return enumeration.nextElement();24 }25 26 @Override27 public void remove() {28 //不支援此操作,所以用異常來通知使用者29 throw new UnsupportedOperationException(); 30 }31 32 }
測試代碼如下:
1 public class Driver { 2 3 /** 4 * 遍曆列印集合元素的方法 5 * @param iterator 6 */ 7 public<E> void iterate(Iterator<E> iterator){ 8 while(iterator.hasNext()){ 9 System.out.println(iterator.next());10 }11 }12 13 public static void main(String[] args) {14 15 Driver driver = new Driver();16 Vector<String> vector = new Vector<>();17 vector.add("a");18 vector.add("b");19 vector.add("c");20 //這裡我們假設Vector不支援iterators()方法21 //driver.iterate(vector.elements()); //因為iterate方法不支援Enumeration,只支援Iterator,所以這裡需要一個適配器進行轉換22 driver.iterate(new Enumeration2Iterator<>(vector.elements())); 23 }24 25 }適配器模式有兩種:
- “對象”適配器,上面講的就是這種適配器
- “類”適配器,這個需要多重繼承才能實現,大致的實現是讓適配器去繼承被適配的類(比如上例的Iterator)和希望適配的類(比如上例中的Enumeration)
一個適配器可以同時適配多個介面,並不一定非得適配一個介面。當需要使用一個現有的類而其介面並不符合你的需求的時候,就使用適配器模式。裝飾者模式與適配器模式的區別:
- 適配器是用來將一個介面轉換成另一個介面的中介軟體
- 裝飾者模式是通過組合的思想來增強某一個對象的能力
設計模式——適配器模式