概述
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作,适配器很像变压器,把一种电压变成另一种电压,
类适配器模式 : 把被适配的类的API转换成目标类的API,
Adaptee类并没有sampleOperation2()方法,客户端期待这个方法,为使客户端能够使用Adaptee类,提供一个中间环节,既类Adapter,Adapter与Adaptee是继承关系,决定了适配器模式是类的
1.目标(Target)角色:就是所期待的接口,注意,这里讨论的是类适配器模式,因此目标不可以是类
2.源(Adaptee)角色:现在需要适配的接口
3.适配器(Adapter)角色:适配器为是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色可以是接口,而必须是具体类。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
interface Target{ void simpleOperator1(); void simpleOperator2(); } class Adaptee{ public void simpleOperator1(){ } } class Adapter extends Adaptee implements Target{ @Override public void simpleOperator2() { // TODO Auto-generated method stub } }
(二).对象的适配器模式:
它把被适配的类的API转换成目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用类继承关系连接到Adaptee类,而是使用委派关系连接到Adapter类。(把Adaptee类作为Adapter类的一个属性引用)
![](https://images2017.cnblogs.com/blog/1074350/201708/1074350-20170819143547256-1587659804.png)
Adaptee类并没有sampleOperation2()方法,客户端期待这个方法,为使客户端能够使用Adaptee类,提供一个包装类,既类Adapter,Adapter与Adaptee是委派关系,决定了适配器模式是对象的
1.目标(Target)角色:这是所期待的接口,目标可以是具体的或抽象的类
2.源(Adaptee)角色:现在需要适配的接口
3.适配器(Adapter)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口,显然,这一角色必须是具体类。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
interface Target{ void simpleOperator1(); void simpleOperator2(); } class Adaptee{ public void simpleOperator1(){ } } class Adapte implements Target{ private Adaptee adaptee; public Adapte(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void simpleOperator2() { // TODO Auto-generated method stub } @Override public void simpleOperator1() { adaptee.simpleOperator1(); } }
在什么情况下使用适配器模式?
1.系统需要使用现有的类,而此类的接口不符合系统的需要
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象的适配器模式而言)在设计里,需要改变多个已有的子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器类,而这不太实际。
缺省适配器模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。作为适配器模式的一个特例,缺省适配器模式在Java语言中有着特殊的应用。