容易_适配器模式(Adapter)

简单_适配器模式(Adapter)
容易_适配器模式(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;
	}

}