设计模式之适配器模式

 适配器其实在我们生活中无处不在,比如电源适配器。适配器就是用来转换接口。可以不改变原来的代码,通过一个适配器将某个接口转换为你所期望的接口。

 适配器模式的类图如下:

 

    举一个不太恰当的例子,假如现在我需要一只鸭子,但是现在只有火鸡,这时候就需要适配器类了。

    类图大致是这样的

   

     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();
	}
}

 

posted on 2015-01-24 23:24  qingfei  阅读(191)  评论(0编辑  收藏  举报