策略模式----之Comparator
阿新 • • 發佈:2019-01-26
說到現在,讀者應該對Comparable介面有了大概的瞭解,但是為什麼又要有一個Comparator介面呢?難道Java的開發者都吃飽撐著沒事做嗎?
再談Comparator介面之前,大家應該先了解一個叫“策略模式”的東東。一下是百度百科對策略模式的描寫:
策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)之所以要談到策略模式,就是因為Comparator介面其實就是一種策略模式的實踐。實現Comparator介面的類必然就會實現一個compareTo(Object o1, Object o2)的方法,而這個方法就是演算法中的一部分,所有使用了compareTo方法的類都不會關心compareTo是如何工作的,只關心他的返回值,這也是面向物件中著名的封裝特性。
那Comparator介面應該如何使用呢?別急,首先我們要先對Person類進行一下處理,因為我們現在使用Comparator介面,所以Comparable介面就可以光榮的退休了:
1: public class Person {
2:
3: private String name;
4: private int age;
5:
6: public Person() {
7:
8: }
9:
10: public Person(String name, intage) {
11: this.name = name;
12: this.age = age;
13: }
14:
15: public String getName() {
16: return name;
17: }
18:
19: public void setName(String name) {
20: this.name = name;
21: }
22:
23: public int getAge() {
24: return age;
25: }
26:
27: public void setAge(int age) {
28: this.age = age;
29: }
30:
31: @Override
32: public String toString() {
33: return "Person [age=" + age + ", name=" + name + "]";
34: }
35:
36: }
新建一個實現Comparator的實現類PersonComparator:
1: import java.util.Comparator;
2:
3: public class PersonComparator implements Comparator<Person> {
4:
5: @Override
6: public int compare(Person p1, Person p2) {
7: if (p1.getAge() > p2.getAge()) {
8: return 1;
9: } else if (p1.getAge() < p2.getAge()) {
10: return -1;
11: }
12: return 0;
13: }
14:
15: }
然後再用回我們的CompareTest做測試:
1: import java.util.Arrays;
2:
3: public class CompareTest {
4:
5: public static void main(String[] args) {
6: Person[] persons = {
7: new Person("P1", 60),
8: new Person("P2", 20),
9: new Person("P3", 40)
10: };
11:
12: System.out.println(Arrays.toString(persons));
13:
14: Arrays.sort(persons, new PersonComparator());
15:
16: System.out.println(Arrays.toString(persons));
17: }
18:
19: }
注意:在上面的sort方法中,我們傳進了一個PersonComparator的例項物件作為引數,讀者也可以試試不傳入這個引數,看是否能正確工作。
結果當然是跟上面演示的例子一樣啦,我就不再重複了。