适配器模式中的角色
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。 需要适配的类(Adaptee):需要适配的类或适配者类。 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
现方式主要有两种:
类的适配器模式(采用继承实现) 对象适配器(采用对象组合方式实现)
(1)目标接口
/** * 目标接口,也就是我们期望的接口 * @author hadron * */ public interface Target { //普通功能 public void request(); }
(2)已有功能类
/** * 已存在的、具有特殊功能、但不符合我们的要求 * @author hadron * */ public class Adaptee { public void specificRequest() { System.out.println("三孔插座"); } }
(3)适配器类
/** * 适配器类,继承了被适配类Adaptee,同时实现标准接口Target * @author hadron */ public class Adapter extends Adaptee implements Target{ @Override public void request() { System.out.println("适配器类:转换为双孔插座"); this.specificRequest(); } }
(4)Client
public class AdapterDemo { public static void main(String[] args) { Target adapter = new Adapter(); //通过适配器调用特殊功能 adapter.request(); } }
(5)运行结果
适配器类:转换为双孔插座 三孔插座
(1)适配器类
/** * 适配器类,直接关联被适配类,同时实现标准接口 * 采用对象组合方式实现 * @author hadron * */ public class AdapterObject implements Target{ // 直接关联被适配类 private Adaptee adaptee; // 可以通过构造函数传入具体需要适配的被适配类对象 public AdapterObject(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { // 这里是使用委托的方式完成特殊功能 System.out.println("适配器类:转换为双孔插座"); this.adaptee.specificRequest(); } }
(2)Client
public class AdapterObjectDemo { public static void main(String[] args) { Target adapter = new AdapterObject(new Adaptee()); adapter.request(); } }
(3)运行结果
适配器类:转换为双孔插座 三孔插座
(1)Java IO
适配器作用就是讲一个接口适配到另一个接口,在Java 的I/O类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等。
以InputStreamReader和OutputStreamWriter类为例。
InputStreamReader和OutputStreamWriter类分别继承了Reader和writer接口,但是要创建他们的对象必须在构造函数中传入一个InputStream和OutputStream的实例,InputStreamReader和OutputStreamWriter类的作用也就是将InputStream和OutputStream适配到Reader和Writer。适配器是InputStreamReader,源角色是InputStream代表的实例对象,目标接口就是Reader类。
(2)样例演示
package adapter; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; public class AdapterIO { public static void main(String[] args) throws Exception{ File f = new File("c:\\words.txt") ; //字节输入流 InputStream in=new FileInputStream(f); //将字节输入流转换为字符输入流(适配器模式) Reader reader = new InputStreamReader(in) ; //从Reader中最多读取1024个字符 char buffer[] = new char[1024] ; int len = reader.read(buffer) ; reader.close() ; // 关闭 System.out.println(new String(buffer,0,len)) ; } }
输出结果