适配器模式
适配器模式:
把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法再一起工作的两个类能够在一起工作。
注:可以研究inputStreamReader。
现有两个接口Target Adaptee。Traget接口有方法showInfo(),Adaptee接口有方法info()。
package com.zhao.service; /** * Target(目标接口):所要转换的所期待的接口 * @author zhao * */ public interface Target { public void showInfo(); }
package com.zhao.service; /** * 需要适配的接口 * @author zhao * */ public interface Adaptee { public String info(); }
现在的情况是,Target接口和Adaptee接口无法在一起工作,但是Target接口需要用到Adaptee接口,不然无法显示信息。所以需要一个适配器。
package com.zhao.service.impl; import com.zhao.service.Adaptee; import com.zhao.service.Target; public class Adaper implements Target { private Adaptee adaptee; public Adaper(Adaptee adaptee) { this.adaptee=adaptee; } @Override public void showInfo() { System.out.println(adaptee.info()); } }
当需要显示信息时,在主方法里:
package com.zhao.main; import com.zhao.service.Target; import com.zhao.service.impl.Adaper; import com.zhao.service.impl.AdapteeImpl; public class Main { public static void main(String[] args) { Target target=new Adaper(new AdapteeImpl()); target.showInfo(); } }
AdapettImpl继承了接口Adaptee。
package com.zhao.service.impl; import com.zhao.service.Adaptee; public class AdapteeImpl implements Adaptee{ @Override public String info() { return "zhao"; } }
由此可以看出:适配器主要是为了整合两个实现类,他们各自实现了一个接口,这两个接口并不能一起工作,以至于两个类不能一起工作,我们可以把其中的一个类用作适配器类,它实现了自己的接口,重写了相应的方法。在此时,给它添加了一个另外一个接口的对象,通过构造函数或者是setter方法,传进来另外接口的实现类,在适配器类重写的方法中,进行对另外接口方法的操作。
(以下内容摘自 许令波《深入分析Java Web技术内幕》)
InputStreamReader实现了Reader接口,并且持有了InputStream的引用,这里是通过StreamDecoder类简介持有的,因为从byte到char要经过编码。很显然,适配器就是InputStreamReader类,源角色就是InputStream代表的实例对象,目标接口就是Reader类。