1 同一接口的多实现
接口最吸引人的原因之一是相同的接口可以有多个实现。在简单情况下体现在一个方法接受接口作为参数,该接口的实现和传递对象则取决于方法的使用者。
编写一个方法执行某些操作并接受一个指定的接口作为参数。可以说:“只要对象遵循接口,就可以调用方法”,这使得方法更加灵活,通用,并更具可复用性。
package com.hcong.interfaces;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.Random;
import java.util.Scanner;
/**
* @Classname RandomStrings
* @Date 2023/4/3 14:51
* @Created by HCong
*/
public class RandomStrings implements Readable {
private static Random rand = new Random(1);
private static final char[] CAPITALS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
private static final char[] LOWERS = "abcdefghijklmnopqrstuvwxyz".toCharArray();
private static final char[] VOWELS = "aeiou".toCharArray();
private int count;
public RandomStrings(int count) {
this.count = count;
}
@Override
public int read(CharBuffer cb) throws IOException {
if (count-- == 0)
return -1;
cb.append(CAPITALS[rand.nextInt(CAPITALS.length)]);
for (int i = 0; i < 4; i++) {
cb.append(VOWELS[rand.nextInt(VOWELS.length)]);
cb.append(LOWERS[rand.nextInt(LOWERS.length)]);
}
cb.append(" ");
return 10; // Number of characters appended
}
public static void main(String[] args) {
Scanner sc = new Scanner(new RandomStrings(5));
while (sc.hasNext()) {
System.out.println(sc.next());
}
}
}
Rohomuuew
Kuxifiqie
Eueiaueus
Disamacoj
Taduxariv
2 接口与适配器模式
假设你有一个类没有实现 Readable
接口,怎样才能让 Scanner
作用于它呢?
package com.hcong.interfaces;
import java.util.Random;
/**
* @Classname RandomDoubles
* @Date 2023/4/3 15:08
* @Created by HCong
*/
public interface RandomDoubles {
Random RAND = new Random(47);
default double next() {
return RAND.nextDouble();
}
static void main(String[] args) {
RandomDoubles rd = new RandomDoubles() {
};
for (int i = 0; i < 7; i++) {
System.out.println(rd.next() + " ");
}
}
}
通过关键字 interface
提供的多继承,我们可以创建一个既是 RandomDoubles
,又是 Readable
的类:
package com.hcong.interfaces;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.Scanner;
/**
* @Classname AdaptedRandomDoubles
* @Date 2023/4/3 15:10
* @Created by HCong
*/
public class AdaptedRandomDoubles implements RandomDoubles, Readable {
private int count;
public AdaptedRandomDoubles(int count) {
this.count = count;
}
@Override
public int read(CharBuffer cb) {
if (count-- == 0) {
return -1;
}
String result = Double.toString(next()) + " ";
cb.append(result);
return result.length();
}
public static void main(String[] args) {
Scanner s = new Scanner(new AdaptedRandomDoubles(7));
while (s.hasNextDouble()) {
System.out.println(s.nextDouble() + " ");
}
}
}
0.7271157860730044
0.5309454508634242
0.16020656493302599
0.18847866977771732
0.5166020801268457
0.2678662084200585
0.2613610344283964