适配器模式:将一个类的接口转换成客户客户希望的另一个接口。适配器模式使得原本由于接口不能兼容而不能在一起工作的那些类可以在一起工作
适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新接口。也就是说,客户端需要的功能应该是已经实现好了的,不需要适配器模式来实现,适配器模式主要负责把不兼容的接口转换成客户端期望的样子就可以了。
package pattern.adapter;
/**
* 已存在的接口,这个接口需要被适配
* @author Administrator
*
*/
public class Adatpee {
/**
* 原本已存在,需要适配的方法
*/
public void specificRequest(){
}
}
----
package pattern.adapter;
/**
* 定义客户端使用的接口,与特定领域相关
* @author Administrator
*
*/
public interface Target {
/**
* 客户端请求处理的方法
*/
public void request();
}
----
package pattern.adapter;
/**
* 适配器
* @author Administrator
*
*/
public class Adaper implements Target{
private Adatpee adatpee;
public Adaper(pattern.adapter.Adatpee adatpee) {
super();
this.adatpee = adatpee;
}
@Override
public void request() {
adatpee.specificRequest();
}
}
----
package pattern.adapter;
public class Client {
public static void main(String[] args) {
/*创建需要被适配的对象*/
Adatpee adatpee = new Adatpee();
/*创建客户端需要调用的接口对象*/
Target target = new Adaper(adatpee);
/*请求处理*/
target.request();
}
}
对象组合
根据前面的实现,你会发现,适配器实现的方式其实是依靠对象组合的方式。通过给适配器对象组合被适配的对象,然后当客户端调用Target的时候,适配器会把相应的功能委托给被适配的对象去完成。
调用顺序
适配器模式的优缺点:
1、更好的复用性
如果功能是已经有了的,只是接口不兼容,那么通过适配器模式就可以让这些功能得到更好的复用
2、更好的可扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能
缺点
过多的使用适配器模式,会让系统非常凌乱,不容易整体进行把握
比如,明明看到调用的是A接口,其实内部被适配成了B接口来实现,一个系统如果出现太多这种情况,无异于异常灾难,因此如果不是很有必要,可以不使用适配器模式,而是直接对系统进行重构
何时选用适配器模式
1、如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口。
2、如果你想创建一个可复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么适配什么。
3、如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行匹配,这种情况可以选用对象适配器,直接视频这些子类的父类就可以了