适配接口

接口最吸引人的原因之一就是允许同一个接口具有多种不同的实现。

接口最常见的用法就是使用策略设计模式。此时你编写一个执行某些操作的方法,而该方法将接受一个你指定的接口。你主要就是声明:”你可以用任何你想要的对象来调用我的方法,只要你的对象调用我的接口。”

package ahu;
import java.util.*;
interface Processor{
	String name();
	Object process(Object input);
}
class Process implements Processor {
	public String name(){
		return getClass().getName();
	}
	public Object process(Object input){
		return input;
	}
}

class Upcase extends Process{
	public String process(Object input){
		return ((String)input).toUpperCase();
	}
}

class Downcase extends Process{
	public String process(Object input){
		return ((String)input).toLowerCase();
	}
}

class Splitter extends Process{
	public String process(Object input){
		return Arrays.toString(((String)input).split(" "));
	}
}

public class Apply1 {
	public static void process(Processor p,Object s ){
		System.out.println("Using Processor: "+p.name());
		System.out.println(p.process(s));
	}
	public static String s="Disagreement with beliefs is by definition incorrect";
	public static void main(String[] args) {
		process(new Upcase(),s);
		process(new Downcase(),s);
		process(new Splitter(),s);
	}

}
运行结果:

Using Processor: ahu.Upcase
DISAGREEMENT WITH BELIEFS IS BY DEFINITION INCORRECT
Using Processor: ahu.Downcase
disagreement with beliefs is by definition incorrect
Using Processor: ahu.Splitter
[Disagreement, with, beliefs, is, by, definition, incorrect]


另一个典型的例子就是Java SE5中的Scanner类,它的构造器接受的就是一个Readable接口,你会发现Readable没有用作java标准类库中其他任何方法的参数,它是单独为Scanner创建的,以使得Scanner不必将其参数限制为某个特定的类。通过这种方式,Scanner可以作用于更多的类型。如果你创建的一个新的类,并且想让Scanner类作用于它,那么你就应该让它成为一个Readable。

package ahu;
import java.nio.*;
import java.util.*;

public class RandomWords implements Readable {
	private static final Random rand=new Random(47);
	private static final char[] capitals="ABCDEFGHIJKLMNOPQISTUVWXYZ".toCharArray();
	private static final char[] lowers="abcdefghijklmnopqistuvwxyz".toCharArray();
	private static final char[] vowels="aeiou".toCharArray();
	private int count;
	public static int number;
	public RandomWords(int count){
		this.count=count;
	}
	public int read(CharBuffer cb){
		if(count--==0)
			return -1;
		System.out.println("第"+ (++number) +"次调用read");
		cb.append(capitals[rand.nextInt(capitals.length)]);
		for(int i=0;i<4;i++){
			cb.append(lowers[rand.nextInt(lowers.length)]);
			cb.append(vowels[rand.nextInt(vowels.length)]);
		}
		cb.append(" ");
		return 10;
	}
	public static void main(String[] args) {
		Scanner s=new Scanner(new RandomWords(10));
		while(s.hasNext()){
			System.out.println(s.next());
		}
	}

}
运行结果:

第1次调用read
Ynobenogi
第2次调用read
Foozutoqe
第3次调用read
Gsegemuje
第4次调用read
Ioisueeue
第5次调用read
Neueolome
第6次调用read
Hlieehoca
第7次调用read
Ieeuebiki
第8次调用read
Naieobuwa
第9次调用read
Kjiiokope
第10次调用read
Wsupodoco


软件包 java.nio定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。

public final class Scanner extends Object implements Iterator<String>

Scanner(Readable source)
构造一个新的 Scanner,它生成的值是从指定源扫描的。

public interface Readable
 

Readable 是一个字符源。阅读方法的调用方能够通过 CharBuffer 使用 Readable 中的字符。

read(CharBuffer cb) 
试图将字符读入指定的字符缓冲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值