标签:
适配器其实在我们生活中无处不在,比如电源适配器。适配器就是用来转换接口。可以不改变原来的代码,通过一个适配器将某个接口转换为你所期望的接口。
适配器模式的类图如下:
举一个不太恰当的例子,假如现在我需要一只鸭子,但是现在只有火鸡,这时候就需要适配器类了。
类图大致是这样的
Duck是目标接口
public interface Duck { public void quack(); public void fly(); }
TurkeyAdapter类就是适配器类,它实现了Duck接口,并且内部有一个Turkey的引用。
public class TurkeyAdapter implements Duck { Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey=turkey; } public void quack()//实现了Duck接口的方法 { turkey.gobble(); } public void fly()//实现了Duck接口的方法 { for(int i=0;i<4;i++) { turkey.fly(); } } }
Turkey类就是被适配类
public class Turkey { public void gobble() { System.out.println("gobble!"); } public void fly() { System.out.println("fly!!"); } }
测试类,也就是Client类
public class Test { public static void main(String[] args) { Duck duck=new TurkeyAdapter(new Turkey()); duck.quack(); duck.fly(); } }
于是这只火鸡就冒充了鸭子了。
适配器模式实际上有两种形式,一种是类适配器,一种是对象适配器,上面这一种就是对象适配器。
类适配器的Adapter类通过继承目标接口和被适配者类来进行适配,有时候并不需要覆写所有的被适配者类的代码,可以通过继承被适配者类的方法来适配目标接口,但是类适配器不能适配被适配者的子类,不能实现代码的复用,且不符合“多用组合,少用继承”的原则,java不支持多重继承,所以很少使用类适配器。
对象适配器比较灵活,因为它还可以适配被适配者的子类,而且采用的是组合的方式,所以较多使用的是对象适配器。
举一个现实中的例子,早期的集合类(Vector,Hashtable等等)都实现了一个叫elements()方法,它返回的是Enumeration接口的对象,可以遍历集合内的元素,后来更新的集合类则用的是Iterator接口,这个接口也是用来遍历集合类型内的每个元素,还新增了一个删除元素的能力。
现在假如我们面对早期的遗留代码,这些代码使用的是枚举器,而我们又希望使用迭代器,这时候就需要有一个适配器了。
import java.util.Iterator; public class EnumerationIteratorAdapter implements Iterator { Enumeration enum; public EnumerationIteratorAdapter(Enumeration enum) { this.enum=enum; } public boolean hasNext() { return enum.hasMoreElements(); } public Object next() { return enum.nextElement(); } public void remove() { //Enumeration接口没有remove方法,只好抛出异常了。 throw new UnSupportedOperationException(); } }
标签:
原文地址:http://www.cnblogs.com/qingfei1994/p/4245936.html