读书人

适配器模式兑现利用Scanner来扫描实现

发布时间: 2012-06-20 20:37:21 作者: rapoo

适配器模式实现利用Scanner来扫描实现了Readable接口的对象

显然这里的适配器是用来适配 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());
}

}

读书人网 >编程

热点推荐