[img]http://dl.iteye.com/upload/attachment/0062/7952/e51a3151-339d-332b-a00e-242a9bf562f4.jpg[/img]
jdk中io流InputStreamReader/OutputStreamWriter就运用了适配器模式,
其目的就是为了把字节流接口转换成字符流接口来使用。
[color=red]写这篇文章使我搞清楚了 代理模式(Proxy)、装饰模式(Decorator)、适配器模式(Adapter)之间的区别,其实写技术文章是个好习惯,虽然有些东西已经懂了但是写着写着又会有一些新的东东产生。希望刚入行的自己能把这个写技术文章的习惯坚持下去。[/color]
下面是对该模式的简单理解:
jdk中io流InputStreamReader/OutputStreamWriter就运用了适配器模式,
其目的就是为了把字节流接口转换成字符流接口来使用。
[color=red]写这篇文章使我搞清楚了 代理模式(Proxy)、装饰模式(Decorator)、适配器模式(Adapter)之间的区别,其实写技术文章是个好习惯,虽然有些东西已经懂了但是写着写着又会有一些新的东东产生。希望刚入行的自己能把这个写技术文章的习惯坚持下去。[/color]
下面是对该模式的简单理解:
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;
}
}