针对接口而非具体类型的编程

在一些程序中,代码并不知道具体的类型,才是接口发挥威力的地方。

举个栗子,一个使用MyComparable接口的类CompUtil,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class CompUtil {
//找出最大值
public static Object max(MyComparable[] objs) {
//objs为空
if (objs == null || objs.length == 0) {
return null;
}
MyComparable max = objs[0];
for (int i=1;i<objs.length;i++) {
if (max.compareTo(objs[i]) < 0) {
max = objs[i];
}
}
return max;
}
//从小到大排序
public static void sort(MyComparable[] objs) {
for (int i=0;i<objs.length;i++) {
int min = i;
for (int j=i+1;j<objs.length;j++) {
if (objs[j].compareTo(objs[min])<0) {
min = j;
}
}
if (min!=i) {
MyComparable temp = objs[i];
objs[i] = objs[min];
objs[min] = temp;
}
}
}
}

CompUtil类提供了两个方法,max获取传入数组中的最大值,sort对数组进行升序排序,参数都是MyComparable类型的的数组。

这个类是针对MyComparable接口编程,它并不知道具体的类型是什么,也并不关心,但却可以对任意实现了MyComparable接口的类型进行操作。

接下来对Point类型进行操作:

1
2
3
4
5
6
7
8
9
Point[] points = new Point[] {
new Point(2,3),
new Point(3,4),
new Point(1,2)
};

System.out.println("max: " + CompUtil.max(points));
CompUtil.sort(points);
System.out.println("sort: " + Arrays.toString(points));

points可以作为MyComparable[]类型的参数。实际上,可以针对任何实现了MyComparable接口的类型数组进行操作。

针对接口而非具体类型进行编程,是计算机程序的一种重要思维方式。

接口的优点:

1.代码复用。同一套代码可以处理多种不同类型的对象,只要这些对象都有相同的能力。

2.降低了耦合,提高了灵活性。使用接口的代码依赖的是接口本身,而非实现接口的具体类型。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2021 Silver Shaded
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信