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