这个模式挺简单的,大家一看就懂。
首先,适配器模式有两个角色,适配器,适配对象;
我们先说,生活中有哪些与适配器模式类似的地方?
听过最多的例子,电源插座!
你有台电子设备,插头是三孔的,结果电源排插只提供了两孔的;这个时候你怎么办?你得买一个转接插座,这个插座有头是两孔的,它可以连接上原来的插座,而它也提供一个三孔的入口让你可以插入,这个时候就完美解决了你的问题!
然我们来画一个丑陋不堪的图看看样子...这图我都不好意思贴出来...
那...就让我们以这幅图来写代码吧!
/**一个两孔插座接口*/
public interface TwoSocket {
//插头插入
void into();
//插头拔出
void out();
}
/**格力牌排插!*/
class GreeSocket implements TwoSocket{
@Override
public void into() {
System.out.println("格力插入插头");
}
@Override
public void out() {
System.out.println("格力拔出插头");
}
}
/**一个三孔插座接口*/
interface ThreeSocket {
//插头插入
void into();
//插头拔出
void out();
}
/**创建一个两孔插座适配器,实现我们客户端想要的三孔接口*/
class TwoSocketAdapter implements ThreeSocket{
//适配对象
private TwoSocket twoSocket;
public TwoSocketAdapter(TwoSocket twoSocket) {
this.twoSocket = twoSocket;
}
@Override
public void into() {
//在实际运用上,没有这么简单,不可能直接去调用适配对象的方法,有可能要做些数据转换
System.out.println("可能要做的数据转换...");
twoSocket.into();
}
@Override
public void out() {
twoSocket.out();
}
}
public class Test {
public static void main(String[] args) {
//由于我们的插头是三线的,要使用三孔插座接口
//但房间里的格力牌插座是两孔的,我们无法当作三孔插座来用
//ThreeSocket ts = new GreeSocket();类型不匹配,报错!
//我们为格力牌插座创建一个插座转换器(插座适配器),让它看起来像是个三孔插座
TwoSocket socket = new GreeSocket();
ThreeSocket ts = new TwoSocketAdapter(socket);
//调用适配器的方法时,底层还是调用被适配对象的方法
//只不多在内部可能经过了各种数据转换
ts.into();
}
}
************************************************************************
可能要做的数据转换...
格力插入插头
************************************************************************
最后,让我们来定义下适配器模式!
适配器模式:将一个类的接口转换成客户所期望和能够使用的另一个接口,让两个原本不兼容的类能够使用起来,在底层,适配器的行为都依赖于适配对象的行为;