适配器模式
2015-03-22 本文已影响160人
lguipeng
-
UML类图
-
引入
适配器模式主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。比如德国,使用的是德国标准,是两项圆头的插头。如果去德国旅游,那么我们使用的手机充电器插头无法插到德国的插排中去,那就意味着我们无法给手机充电。怎样解决这个问题呢?只要使用一个电源转化器就行了。
-
使用场景
用电源接口做例子,笔记本电脑的电源一般都是接受5V的电压,但是我们生活中的电线电压一般都是220V的输出。这个时候就出现了不匹配的状况,在软件开发中我们称之为接口不兼容,此时就需要适配器来进行一个接口转换。在软件开发中有一句话正好体现了这点:任何问题都可以加一个中间层来解决。这个层我们可以理解为这里的Adapter层,通过这层来进行一个接口转换就达到了兼容的目的。
-
代码举例实现
DBSocketInterface.java
package com.design.adapter;
public interface DBSocketInterface {
//使用两项圆头的插口供电
void powerWithTwoRound();
}
DBSocketInterfaceImpl.java
package com.design.adapter;
public class DBSocketInterfaceImpl implements DBSocketInterface{
@Override
public void powerWithTwoRound() {
System.out.println("使用两项圆头的插孔供电");
}
}
GBSocketInterface.java
package com.design.adapter;
//国标接口
public interface GBSocketInterface {
void powerWithThreeFlat();
}
GBSocketInterfaceImpl.java
package com.design.adapter;
public class GBSocketInterfaceImpl implements GBSocketInterface{
public void powerWithThreeFlat() {
System.out.println("使用三项扁头插孔供电");
}
}
SocketAdapter.java
这就是我们的重要的适配器类
package com.design.adapter;
public class SocketAdapter implements DBSocketInterface{
//组合新接口
private GBSocketInterface gbSocket;
public SocketAdapter(GBSocketInterface gbSocket) {
this.gbSocket = gbSocket;
}
@Override
public void powerWithTwoRound() {
gbSocket.powerWithThreeFlat();
}
}
DBHotel.java
package com.design.adapter;
public class DBHotel {
private DBSocketInterface dbSocket;
public DBHotel(DBSocketInterface dbSocket) {
this.dbSocket = dbSocket;
}
public void charge(){
//使用德标插口充电
dbSocket.powerWithTwoRound();
}
}
App.java
package com.design.adapter;
public class App {
public static void main(String[] args) {
//我去德国旅游,带去的充电器是国标的
GBSocketInterface gbSocket = new GBSocketInterfaceImpl();
//由于没法充电,我拿出随身带去的适配器,并且将我带来的充电器插在适配器的上端插孔中。这个上端插孔是符合国标的,我的充电器完全可以插进去。
SocketAdapter socketAdapter = new SocketAdapter(gbSocket);
//找到一家德国宾馆住下,并且插上适配器
DBHotel hotel = new DBHotel(socketAdapter);
//可以充电了
hotel.charge();
}
}
-
总结
优点
-
更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。 -
更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。