码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之适配器模式

时间:2015-01-25 00:09:46      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

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

 适配器模式的类图如下:

  技术分享

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

    类图大致是这样的

    技术分享

     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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!