名称:适配器, 转接器或包装器.
想一想生活中常见的转接器, 我的手机原配的2.5MM耳机坏了, 有一个普通的3.5MM耳机插头大了, 用不了, 这时候我就需要一个转接器.
这个转接器所做的事情就是接口的转换, 使得原本不兼容的两类东西可以一起工作.
如果这个转接器一头是3.5MM的插口, 一头是2.5MM的插头, 它就是一个对象适配器(对象组合的方法)
如果这个转接器既有2.5MM/3.5MM的插口/插头, 也有2.5MM/3.5MM的插口/插头, 它可说是一个类适配器(多重继承的方法)
当你想使用一个已有的类, 而它的接口不符合你的需求, 那么用适配器吧
当你想建立一个新的类, 它可以与其他接口协同工作, 虽然那些接口可能并不兼容你的类,用适配器吧
当你想使用一些已有的类, 而它们实现了共同的接口,还是用适配器吧,注意是对象适配器噢
有的时候我们定义了一个接口, 可是呢, 大多数子类并不需要实现所有的方法, 这时我们可用一个抽象父类来适配这个接口
如果要实现
WindowListener
接口,则您必须定义该接口内的所有方法。而此抽象类将所有方法都定义为 null,所以只需针对关心的事件定义方法
Adapter有两种实现方式
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();
}
}