适配器模式中的角色
现方式主要有两种:
(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)) ;
}
}
输出结果