适配器模式:
Reader 是目标接口(Target)
InputStream 源角色,就是需要适配的接口(Adeptee)
InputStreamReader 就是适配器(Adepter)
源码:
适配器(InputStreamReader) 继承了目标类(Reader,接口也行),对外提供Reader的统一接口,在创建InputStreamReader时,把InputStream对象转换成了 StreamDecoder 对象(参考构造函数)。
要把A 和 B 连接起来,但是卡扣的开关不对,那么就需要C,把两都连接起来。这种模式就是适配器模式。
定义:将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器角色:
目标角色: Target
源角色: Adaptee
适配器角色: Adapter , 把Adaptee 转换成 Target 的角色。就是上图的C的作用
示例代码:
1、目标角色
/** * 目标角色接口 */ public interface Target { void request(); }
/** * 目标角色实现 */ public class ConcreteTarget implements Target { @Override public void request() { System.out.println("request"); } }
2、源角色
/** * 源角色 */ public class Adaptee { public void doSomething(){ System.out.println("源角色"); } }
3、适配器角色
/** * 适配器角色 */ public class Adapter extends Adaptee implements Target{ @Override public void request() { super.doSomething(); } }
4、测试
public static void main(String[] args) { //直接使用原来的目标角色 Target t = new ConcreteTarget(); t.request(); //使用适配器 Target t2 = new Adapter(); t2.request(); }
jdk 中使用的适配器模式:
java.io.InputStreamReader 类就是适配器,把InputStream 输入转化成了Reader 输入。具体的可以查看源码。Reader 是目标接口(Target)
InputStream 源角色,就是需要适配的接口(Adeptee)
InputStreamReader 就是适配器(Adepter)
源码:
适配器(InputStreamReader) 继承了目标类(Reader,接口也行),对外提供Reader的统一接口,在创建InputStreamReader时,把InputStream对象转换成了 StreamDecoder 对象(参考构造函数)。
适配器(InputStreamReader)实现的所有目标类(Target类 Reader)的方法都是 StreamDecoder 来实现的。
上面的写法是类适配器,下面这种写法是对象适配器。
在适配器中聚合了源角色属性
//源角色 interface Adapee{ void biphase(); } //目标接口 interface Target{ void biphase(); void threePhase(); } //适配器 class Adaper implements Target,Adapee{ private Adapee adapee;//聚合Adapee 的实现 //构造器,set 方法等 public void biphase(){ adapee.biphase(); } public void threePhase(){ //相关实现代码 } }