且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-13 07:47:21

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

}