什么是适配器模式?
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
适配器模式中的角色
目标接口(Traget):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或者适配者类。
适配器:通过包装一个需要适配的对象,把原接口转换成目标接口。
首先创建Adaptee类,即需要被适配的对象:
package com.note.adapter; /*** * 被适配的类 * (例子中的ps/2键盘) */ public class Adaptee { public void request() { System.out.println("可以完成客户请求的需要的功能!"); } }
创建Target接口,就是给客户端调用的接口:
package com.note.adapter; public interface Target { void handleReq(); }
创建适配器类,负责将Adaptee适配到Target,起到了转换器的作用:
package com.note.adapter; /** * adpater适配器 * (相当于usb和ps/2的转换器) */ public class Adapter extends Adaptee implements Target { @Override public void handleReq() { super.request(); } }
客户端测试
package com.note.adapter; /** * 客户端类 * (相当于例子中的笔记本,只有USB接口) */ public class Client { public void test(Target t) { t.handleReq(); } public static void main(String[] args) { Client c = new Client(); c.test(new Adapter()); } }
但是上面这个版本的Adapter采用的是继承Adaptee的方式注入Adaptee,java中采用的是单继承,如果此时Adapter还需要继承其他类则没有办法了,不够灵活。
下面采用的是对象组合的方式,将Adaptee注入到Adapter中,更为灵活,建议用下面的方法创建Adapter:
package com.note.adapter; /** * adpater适配器 * (相当于usb和ps/2的转换器) */ public class Adapter2 implements Target { private Adaptee mAdaptee; public Adapter2(Adaptee adaptee) { mAdaptee = adaptee; } @Override public void handleReq() { mAdaptee.request(); } }
适配器模式的使用场景:
用来做旧系统的改造和升级;
转换流就是使用的适配器模式,
java.io.InputStreamReader
java.io.OutputStream