名称:适配器, 转接器或包装器.
想一想生活中常见的转接器, 我的手机原配的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(); } }