这个模式挺简单的,大家一看就懂。
首先,适配器模式有两个角色,适配器,适配对象;
我们先说,生活中有哪些与适配器模式类似的地方?
听过最多的例子,电源插座!
你有台电子设备,插头是三孔的,结果电源排插只提供了两孔的;这个时候你怎么办?你得买一个转接插座,这个插座有头是两孔的,它可以连接上原来的插座,而它也提供一个三孔的入口让你可以插入,这个时候就完美解决了你的问题!
然我们来画一个丑陋不堪的图看看样子...这图我都不好意思贴出来...
那...就让我们以这幅图来写代码吧!
/**一个两孔插座接口*/ 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(); } }************************************************************************
可能要做的数据转换... 格力插入插头 ************************************************************************
最后,让我们来定义下适配器模式!
适配器模式:将一个类的接口转换成客户所期望和能够使用的另一个接口,让两个原本不兼容的类能够使用起来,在底层,适配器的行为都依赖于适配对象的行为;