显然这里的适配器是用来适配 ScannerObject的...因为这个类并没有实现 Readable接口 所以 Scanner也就无法作用于他 。。。
我们从ScannerObject派生了一个ScannerAdapter并且实现了 Readable接口 。实现了Readable的read方法。。
Scanner之所以能从对象读取数据 ,我们观察Scanner的源码发现 其实这个类中 存在一个CharBufer的成员,buf ,在nextXXX等方法触发的时候
会调用Read并将 CharBuffer成员传递进去 .....然后 next等方法再根据内部的定义 从CharBuffer中读取我们想要的数据
...
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.Random;
import java.util.Scanner;
class ScannerObject //利用Scanner类+适配器模式实现利用Scanner操作对象
{
private char []charLow="abcdefghijklmnopqrstuvwxyz".toCharArray() ;
private char []charUP="abcdefghijklmnopqrstuvwxyz".toUpperCase().toCharArray();
private int count ;
private Random r=new Random(67) ;
public ScannerObject(int count){
this.count=count ;
}
public int getCount(){
return this.count ;
}
public String nextString()
{
StringBuffer buf=new StringBuffer() ;
for(int i=0;i<10;i++){
buf.append(charLow[r.nextInt(26)] ) ;
buf.append(charUP[r.nextInt(26)]) ;
}
return buf.toString();
}
}
class ScannerAdapter extends ScannerObject implements Readable{
public ScannerAdapter(int count) {
super(count); //因为基类没有默认构造器所以必须添加
}
@Override
public int read(CharBuffer cb) throws IOException //Scanner会调用传递这个方法 CharBuffer是Scanner类的内部成员buf 有Scanner传递进去
{
String str="" ;
for(int i=0;i<getCount();i++){
str+=nextString() ;
}
str+=' ' ; //Scanner的next在遇到空字符或者 '\n'的时候结束扫描
cb.put(str);
return str.length();
}
}
public class ReadObject {
public static void main(String[]agrs){
System.out.println(new Scanner(new ScannerAdapter(3)).next());
}
}