概念
将一个接口转换成客户希望的另外一个接口。(该模式使得原本不兼容的类可以一起工作)。
UML图
适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。
(1)对象的适配器模式结构图
(2)类的适配器模式结构图
模式所涉及的角色有:
● 目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
● 源(Adapee)角色:现在需要适配的接口。
● 适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
对象的适配器模式的不同之处在于Adapter角色封装了Adaptee角色,而不像类的适配器模式所采取的继承方式。其原理基本上是相似的
实现:
对象的适配器模式
public class Adapter implements Target{ private Adaptee adaptee ; public Adapter() { super(); this.adaptee = new Adaptee(); } @Override public void getHeadset2() { adaptee.getHeadset3(); } public static void main(String args[]){ Target target = new Adapter(); target.getHeadset2(); } } interface Target{ void getHeadset2(); } class Adaptee{ public void getHeadset3(){ System.out.println("我是3.5mm的耳机哦"); } }
类的适配器模式
public class Adapter extends Adaptee implements Target{ @Override public void getHeadset2() { this.getHeadset3(); } public static void main(String args[]){ Target target = new Adapter(); target.getHeadset2(); } } interface Target{ void getHeadset2(); } class Adaptee{ public void getHeadset3(){ System.out.println("我是3.5mm的耳机哦"); } }
缺省适配器模式
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是空方法。而具体的子类都要继承此抽象类。
适配器模式的用意是要改变源的接口,以便于目标接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现。
在任何时候,如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。这样,从这个抽象类再继承下去的子类就不必实现所有的方法了。
适配器的适配程度
1、完全适配
如果目标接口中的方法数目与被适配者接口的方法数目相等那么适配器可将被适配者接口与目标接口进行完全适配
2、不完全适配
如果目标接口中的方法数目少于被适配者接口的方法数目那么适配器只能将被适配者接口与目标接口进行适配
3、剩余适配
如果目标接口中的方法数目大于被适配者接口的方法数目。那么适配器可将被适配者接口与目标接口进行完全适配,但必须将目标多余的方法给出用户允许默认实现
适配器模式的优点
- 更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
- 更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
适配器模式的缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
适配器模式应用场景
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
参考来自:
http://blog.csdn.net/qq7342272/article/details/6921251
http://www.cnblogs.com/ikuman/archive/2013/01/26/2866755.html
http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html