Adapter适配器模式的理解
Adapter适配器模式是一种结构型模式,主要应对:由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是,新环境要求的接口是现存对象所不满足的。
《设计模式》中说道:将一个类的接口转换成客户端程序希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
下面列举一个具体的应用场景(摘录自Thinking In Java)
我们知道,如果要使一个类能用于foreach语法,可以让这个类实现Iterable接口。假如有一个Iterable类,你想添加一种或者多种在foreach语句中使用这个类的方法,应该如何做呢?例如,假设你希望可以选择以向前的方向或者向后的方向迭代一个单词列表。如果直接继承这个类,并覆盖iterator()方法,你只能替代现有的方法,而不能实现选择。
当你有一个接口并需要另一个接口时,编写适配器就可以解决问题。这里,我希望在默认的前向迭代器的基础上,添加反向迭代器的能力,因此不能使用覆盖,而是添加了一个能够产生Iterable对象的方法,该对象可以用于foreach语句,这使得我们可以提供多种使用foreach的方式:
代码如下:
class ReverisbleArrayList<T> extends ArrayList<T> { public ReverisbleArrayList(Collection<T> c) {super(c);} public Iterable<T> reverse() { return new Iterable<T>() { //实现iterable接口的 匿名内部类 @Override public Iterator<T> iterator() { return new Iterator<T>() { int current = size() - 1; @Override public boolean hasNext() { return current > -1; } @Override public T next() { return get(current--); } @Override public void remove() { } }; } }; } } public class AdapterMethodIdiom { public static void main(String[] args) { ReverisbleArrayList<String> ral = new ReverisbleArrayList<String>( Arrays.asList("asm c c++ java c# python".split(" ")) ); for(String s : ral) System.out.print(s + " "); System.out.println(); for(String s : ral.reverse()) System.out.print(s + " "); } }