1. 概念
适配器模式,将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
1.1. 针对的问题
简单的说,就是需要的东西就在面前,但是却不能使用,而短时间内又无法改造它,于是我们就想办法适配它。使得一个东西适合另一个东西的东西。
1.2. 适用的问题
在软件开发中,在系统的数据和行为都正确,但是接口不符时,就应该考虑用适配器,目的是使控制范围之外的一个原有对象和某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
2.角色构成
(1)目标角色(Target): 这就是所期待得到的接口。
(2)源角色(Adaptee):需要适配的接口
(3)适配器角色(Adapter):适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
3.实现
代码中有两个接口,分别为德标接口和国标接口,分别命名为DBSocketInterface和GBSocketInterface,此外还有两个实现类,分别为德国插座和中国插座,分别为DBSocket和GBSocket。为了提供两套接口之间的适配,我们提供了一个适配器,叫做SocketAdapter,让中国插座能够必须符合德国标准的接口,同时在调用上面实现的德标接口进行充电时,提供一种机制,将这个调用转到对国标接口的调用 。
//德标接口 --目标角色,因为要去德国使用
public interface DBSocketInterface {
/**
* 这个方法的名字叫做:使用两项圆头的插口供电
*/
void powerWithTwoRound();
}
//德标插座实现德标接口
// 德国插座
public class DBSocket implements DBSocketInterface{
DBSocket dbsocket = new DBSocket();
public void powerWithTwoRound(){
System.out.println("使用两项圆头的插孔供电");
}
}
//国标接口 --源角色
public interface GBSocketInterface {
/**
* 这个方法的名字叫做:使用三项扁头的插口供电
*/
void powerWithThreeFlat();
}
//中国插座实现国标接口
public class GBSocket implements GBSocketInterface{
@Override
private GBSocket gbsoket = new GBSocket();
public void powerWithThreeFlat() {
System.out.println("使用三项扁头插孔供电");
}
}
//适配器类 继承源角色,实现目标接口
public class SocketAdapter extends GBSocketInterface implements DBSocketInterface{
//组合原角色
private GBSocketInterface gbSocket;
/**
* 在创建适配器对象时,必须传入一个新接口的实现类
* @param gbSocket
*/
public SocketAdapter(GBSocketInterface gbSocket) {
this.gbSocket = gbSocket;
}
//将对旧接口的调用适配到新接口
@Override ××××××××关键方法××××××××
public void powerWithTwoRound() {
gbSocket.powerWithThreeFlat();
}
}
4. 分析
适配器模式的三个特点:
1 适配器对象实现目标接口
2 适配器对象组合一个实现源接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
3 对适配器目标接口方法的调用被委托给源接口的实例的特定方法。