名稱:適配器, 轉接器或包裝器.
?
想一想生活中常見的轉接器, 我的手機原配的2.5MM耳機壞了, 有一個普通的3.5MM耳機插頭大了, 用不了, 這時候我就需要一個轉接器.
這個轉接器所做的事情就是接口的轉換, 使得原本不兼容的兩類東西可以一起工作.
?
如果這個轉接器一頭是3.5MM的插口, 一頭是2.5MM的插頭, 它就是一個對象適配器(對象組合的方法)
如果這個轉接器既有2.5MM/3.5MM的插口/插頭, 也有2.5MM/3.5MM的插口/插頭, 它可說是一個類適配器(多重繼承的方法)
?
當你想使用一個已有的類, 而它的接口不符合你的需求, 那么用適配器吧
當你想建立一個新的類, 它可以與其他接口協同工作, 雖然那些接口可能并不兼容你的類,用適配器吧
當你想使用一些已有的類,?而它們實現了共同的接口,還是用適配器吧,注意是對象適配器噢
?
有的時候我們定義了一個接口, 可是呢, 大多數子類并不需要實現所有的方法, 這時我們可用一個抽象父類來適配這個接口
比如
java.awt.event
.WindowAdapter, 它實現了
WindowFocusListener
,
WindowListener
,
WindowStateListener
,
EventListener
如果要實現
WindowListener
接口,則您必須定義該接口內的所有方法。而此抽象類將所有方法都定義為 null,所以只需針對關心的事件定義方法
Adapter有兩種實現方式
1. 類適配器
2. 對象適配器
看GOF時就順手寫一個Stack Adapter的例子, java從1.1版本帶來的Stack有不少缺點, 用List包裝來實現Stack是個不錯的選擇, 應用Adapter模式, 可以很簡單的做到,以下程序中, ClassStack為類適配器, ObjectStack為對象適配器
1. 類適配器
2. 對象適配器
看GOF時就順手寫一個Stack Adapter的例子, java從1.1版本帶來的Stack有不少缺點, 用List包裝來實現Stack是個不錯的選擇, 應用Adapter模式, 可以很簡單的做到,以下程序中, ClassStack為類適配器, ObjectStack為對象適配器
?
import java.util.LinkedList; import java.util.List; import static java.lang.System.*; /** * StackAdapter, a demo program of Adapter * * @author:Walter Fan at http://wind007.iteye.com ?* @version 1.0 10/28/2008 */ public class StackAdapter { /** * @param args */ public static void main(String[] args) { out.println("Adapter pattern demo:"); Stack<Integer> stack1 = new ClassStack<Integer>(); out.println("=== Class Adapter ==="); for (int i = 0; i < 10; i++) { stack1.push(i); } out.println("=== Object Adapter ==="); Stack<Integer> stack2 = new ClassStack<Integer>(); for (int i = 0; i < 10; i++) { stack2.push(i); } out.println("Good Bye,\n-Walter Fan"); } } interface Stack<T> { void push(T data); T pop(); T top(); int size(); void clear(); boolean isEmpty(); } class ObjectStack<T> implements Stack<T> { private LinkedList<T> myList =new LinkedList<T>() ; public void push(T data) { myList.addFirst(data); } public T top() { return myList.getFirst(); } public T pop() { return myList.removeFirst(); } public boolean isEmpty() { return myList.isEmpty(); } public void clear() { myList.clear(); } public int size() { return myList.size(); } } class ClassStack<T> extends LinkedList<T> implements Stack<T>, List<T> { private static final long serialVersionUID = 1L; public T top() { return getFirst(); } }?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
