JAVA 정책 모드

자바 배열 의 도구 류 Arrays 의 정렬 방법 은 전략 모델 을 전형 적 으로 응용 한 예시 이다.그 정 의 는 다음 과 같다.
public static <T> void sort(T[] a, Comparator super T> c){
    //...
}

주어진 정책 에 따라 배열 을 정렬 하 는 것 을 의미 합 니 다.sort 방법 은 해 야 할 일 입 니 다.T[]a 라 는 배열 은 전략 적 역할 의 대상 이 고 Comparator 전략 자체 입 니 다.그 중에서 Comparator 는 일반적인 인터페이스 로 전략 인 터 페 이 스 를 실현 한 모든 구체 적 인 전략 을 매개 변수 로 전달 할 수 있다.Comparator 는 어댑터 를 사용 하여 T 의 초 클래스 정책 을 이용 하여 T 를 조작 할 수 있 습 니 다.예 를 들 어 우 리 는 다음 과 같은 책 이 있다.
public class Book {
    private double price;

    public Book(double price){
        this.price = price;
    }

    public double getPrice() {
        return price;
    }
}

우 리 는 sort 알고리즘 을 이용 하여 정렬 할 때 정렬 의 근거,즉 전략 을 스스로 선택 할 수 있 습 니 다.
public class StrategyTest {

    @Test
    public void test() {
        Book[] books = new Book[]{new Book(10.00), new Book(8.70), new Book(12.35), new Book(35.50), new Book(12.35)
};

        //     1:           
        Arrays.sort(books, new Comparator(){

            @Override
            public int compare(Book o1, Book o2) {
                return Double.compare(o1.getPrice(), o2.getPrice());
            }

        });

        System.out.println("     1:           ");
        for(Book book : books){
            System.out.print(book.getPrice() + "\t");
        }

        //     2:           
        Arrays.sort(books, new Comparator(){

            @Override
            public int compare(Book o1, Book o2) {
                return Double.compare(o2.getPrice(), o1.getPrice());

            }

        });
        System.out.println("     2:           ");
        for(Book book : books){
            System.out.print(book.getPrice() + "\t");
        }
    }

}

여기 서 익명 내부 클래스 를 사용 하여 전략 을 제공 합 니 다.실제 응용 에서 전략 도 정 해진 처리 방식 으로 사용자 에 게 선택 을 제공 합 니 다.예 를 들 어 String 클래스 에 서 는 대소 문자 가 민감 하지 않 은 정렬 정책 을 제공 합 니 다.
public static final Comparator CASE_INSENSITIVE_ORDER
                                         = new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
            implements Comparator<String>, java.io.Serializable {

        public int compare(String s1, String s2) {
            int n1 = s1.length();
            int n2 = s2.length();
            int min = Math.min(n1, n2);
            for (int i = 0; i < min; i++) {
                char c1 = s1.charAt(i);
                char c2 = s2.charAt(i);
                if (c1 != c2) {
                    c1 = Character.toUpperCase(c1);
                    c2 = Character.toUpperCase(c2);
                    if (c1 != c2) {
                        c1 = Character.toLowerCase(c1);
                        c2 = Character.toLowerCase(c2);
                        if (c1 != c2) {
                            // No overflow because of numeric promotion
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }
        /** Replaces the de-serialized object. */
        private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
    }

자바 집합 도구 류 Collections 도 비슷 한 sort 방법 을 제공 합 니 다.일반적으로 정렬 이 필요 한 클래스 도 Comparable 인 터 페 이 스 를 실현 함으로써 기본 적 인 자연 정렬 방법 을 제공 하지만 자연 정렬 이 수 요 를 만족 시 키 지 못 할 때 Comparator 정책 을 사용 해 야 한다.또한 Collections 는 역 자연 정렬 방법 을 제공 하 는 전략 도 제공 했다.Comparable 인 터 페 이 스 를 실현 한 클래스 에 대해 정렬 할 때 Collections 가 제공 하 는 역순 정렬 정책 을 사용 할 수 있 습 니 다.
//    arrayOfComparable (    Comparable   )     
Arrays.sort(arrayOfComparable);
//    arrayOfComparable           
Arrays.sort(arrayOfComparable, Collections.reverseOrder());

좋은 웹페이지 즐겨찾기