容易_适配器模式(Adapter)
简单_适配器模式(Adapter)

jdk中io流InputStreamReader/OutputStreamWriter就运用了适配器模式,
其目的就是为了把字节流接口转换成字符流接口来使用。
写这篇文章使我搞清楚了 代理模式(Proxy)、装饰模式(Decorator)、适配器模式(Adapter)之间的区别,其实写技术文章是个好习惯,虽然有些东西已经懂了但是写着写着又会有一些新的东东产生。希望刚入行的自己能把这个写技术文章的习惯坚持下去。
下面是对该模式的简单理解:
jdk中io流InputStreamReader/OutputStreamWriter就运用了适配器模式,
其目的就是为了把字节流接口转换成字符流接口来使用。
写这篇文章使我搞清楚了 代理模式(Proxy)、装饰模式(Decorator)、适配器模式(Adapter)之间的区别,其实写技术文章是个好习惯,虽然有些东西已经懂了但是写着写着又会有一些新的东东产生。希望刚入行的自己能把这个写技术文章的习惯坚持下去。
下面是对该模式的简单理解:
package design.adapter2; /** * @author 作者 E-mail: jqsl2012@163.com * @version 创建时间:2012-2-4 下午09:31:06 <br> * */ public class Test { public static void main(String[] args) { /* * 以前充的是220V的电压,后来换成110V的电压,所以需要中间加个适配器 * VAdapter220To110的作用就是把V220这个接口转换成V110接口 * * 适配器模式(Adapter): * 1、类适配器:看起来和代理模式(Proxy)很相似,适配器类和被适配器类都拥有共同的接口,并且适配器类继承被适配类。 * * 2、对象适配器:把被适配的类做为适配器的属性,然后可以很方便的调用被适配对象的方法, * 其实这也可以看成是静态代理中聚合了被代理类的引用,之前类适配器是继承被适配类的,现在 * 不用继承了,为什么呢?因为某些情况下聚合反而比继承要好,比如2个类不存在明显的层级关系, * 如果用继承就不合理了,但是用聚合就非常好,如果两个类存在明显的层级关系却用聚合反而显得不好。 * * 所以适配器模式看起来和代理模式很相似, * 代理模式、装饰模式、适配器模式这3个模式看起都相似, * 相同点:都起到了对被代理/被装饰/被适配 对象的功能上的扩充和访问。 * 区别: * 代理模式主要是以控制被代理类为主, * 装饰模式主要是以扩充被装饰类的功能为主, * 适配器模式主要是以对被适配类的转换为主,比如io流中InputStreamReader/OutputStreamWriter * 就是JDK中适配器模式的运用,主要是把字节流转换为字符流。 * * 这3中模式的基本结构是相似甚至是相同的,紧紧是逻辑存在差异,然而GOF却把他们各取一个名字我在想是不是显得有些多余 * 甚至是把问题搞复杂了,但有一点可以肯定就是名字区分了其功能。 * 比如代理模式,确实是做为一个代理而存在的; * 装饰模式,确实是作为一个装饰而存在的; * 适配器模式很容易就让人想到了充电用的适配器。 * 这么说来又确实有必要用3种不同的名字加以区分,在不同的场合下因为各自所起的作用不同,那么名字也就不一样了。 */ V110 v110 = new VAdapter220To110(new V220Impl()); v110.powerV110(); } }
package design.adapter2; /** * @author 作者 E-mail: jqsl2012@163.com * @version 创建时间:2012-2-4 下午09:33:47 <br> */ public abstract class V220 { public abstract int powerV220(); }
package design.adapter2; /** * @author 作者 E-mail: jqsl2012@163.com * @version 创建时间:2012-2-4 下午09:41:51 <br> */ public abstract class V110 { public abstract int powerV110(); }
package design.adapter2; /** * @author 作者 E-mail: jqsl2012@163.com * @version 创建时间:2012-2-4 下午09:50:20 <br> * */ public class V220Impl extends V220 { @Override public int powerV220() { System.out.println("v220"); return 220; } }
package design.adapter2; /** * @author 作者 E-mail: jqsl2012@163.com * @version 创建时间:2012-2-4 下午09:34:18 <br> * 适配器类,负责把V220这个接口转换成V110接口 */ public class VAdapter220To110 extends V110 { private V220 v220; //任何V220接口的实现类都可以丢进来,以便V220和V110接口可以相互工作 public VAdapter220To110(V220 v220) { this.v220 = v220; } @Override public int powerV110() { int v = this.v220.powerV220(); System.out.println("经过适配器,220V转换成110V"); return 110; } }