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为对象适配器
 
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();
	}
}
 
 
 
 

你可能感兴趣的:(工作,生活)