범용 인터페이스

5496 단어
범용 인터페이스의 개념
범 형 도 인터페이스 에 사용 할 수 있다. 예 를 들 어 생 성기 (generator) 는 생 성 대상 을 전문 적 으로 담당 하 는 유형 으로 실제 적 으로 이것 은 공장 방법 디자인 모델 의 응용 이다.그러나 이들 사이 에 다른 것 은 생 성기 의 호출 은 어떠한 매개 변수 도 필요 하지 않 지만 공장 방법 은 일반적으로 매개 변수 가 필요 하 다 는 것 이다.생 성 기 는 새로운 대상 을 만 들 기 위해 별도의 정보 가 필요 없다 는 뜻 이다.
생 성기 인터페이스의 정의
일반적으로 하나의 생 성 기 는 하나의 방법 만 정의 하 는데 이 방법 은 새로운 대상 을 만 드 는 데 쓰 인 다.여기 서 바로 next() 방법 입 니 다.
public interface Generator {
    T next();
}

Coffee 생 성기 만 들 기
우선 우 리 는 생 성 을 위해 몇 가지 종류 가 필요 하 다
// Coffee.java
public class Coffee {
    private static long counter = 0;
    private final long id = counter++;

    @Override
    public String toString() {
        return getClass().getSimpleName() + " " + id;
    }
}

// Latte.java
public class Latte extends Coffee{}

// Mocha.java
public class Mocha extends Coffee{}

// Cappuccino.java
public class Cappuccino extends Coffee{}

// Americano.java
public class Americano extends Coffee{}

// Breve.java
public class Breve extends Coffee{}

이어서 우 리 는 생 성 기 를 만 들 었 다.
public class CoffeeGenerator implements Generator, Iterable {

    private Class[] types = {Latte.class, Mocha.class, Cappuccino.class, Americano.class, Breve.class};

    private Random rand = new Random(47);

    public CoffeeGenerator() {
    }

    private int size = 0;

    public CoffeeGenerator(int size) {
        this.size = size;
    }

    @Override
    public Coffee next() {
        try {
            return (Coffee) types[rand.nextInt(types.length)].newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    class CoffeeIterator implements Iterator {

        int count = size;

        public boolean hasNext() {
            return count > 0;
        }

        @Override
        public Coffee next() {
            count--;
            return CoffeeGenerator.this.next();
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

    @Override
    public Iterator iterator() {
        return new CoffeeIterator();
    }

    public static void main(String[] args) {
        CoffeeGenerator gen = new CoffeeGenerator();
        for (int i = 0; i < 5; i++) {
            System.out.println("gen.next() = " + gen.next());
        }
        for (Coffee coffee : new CoffeeGenerator(5)) {
            System.out.println("coffee = " + coffee);
        }
    }
}
// Outputs
gen.next() = Americano 0
gen.next() = Latte 1
gen.next() = Americano 2
gen.next() = Mocha 3
gen.next() = Mocha 4
coffee = Americano 5
coffee = Latte 6
coffee = Americano 7
coffee = Mocha 8
coffee = Mocha 9

매개 변수 화 된 Generatoer 인터페이스 확보 next() 의 반환 값 은 매개 변수의 유형 입 니 다.CoffeeGenerator 인 터 페 이 스 를 동시에 실현 하기 때문에 Iterable 순환 에서 사용 할 수 있다.그러나 언제 멈 출 지 판단 하 는 '말단 보초병' 이 필요 하 다. 이것 이 바로 두 번 째 구조 기의 기능 이다.
Fibonacci 수열 생 성기 만 들 기
다음 클래스 도 ForEach 인 터 페 이 스 를 실 현 했 습 니 다. 피 보 나치 수열 생 성 을 담당 합 니 다.
public class Fibonacci implements Generator {

    private int count = 0;

    public Integer next() {
        return fib(count++);
    }

    private int fib(int n) {
        if (n < 2) {
            return 1;
        }
        return fib(n - 2) + fib(n - 1);
    }

    public static void main(String[] args) {
        Fibonacci gen = new Fibonacci();
        for (int i = 0; i < 18; i++) {
            System.out.print(gen.next() + " ");
        }
    }
}
// Outputs
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584

여기 서 알 수 있 듯 이 Generator 에서 사용 하 는 것 은 모두 Fibonacci 유형 이지 만 그 매개 변수 유형 은 int 이다.이것 은 자바 범 형의 한계 성 때문이다. 기본 유형 은 유형 매개 변수 로 할 수 없 기 때문이다.그러나 자바 SE5 는 자동 포장 과 가방 을 뜯 는 기능 을 제공 하여 기본 유형 과 해당 하 는 포장 기 유형 간 에 편리 하 게 전환 할 수 있다.Integer 피 보 나치 생 성 기 를 작 성 했 습 니 다.
더 나 아가 고 싶다 면 Iterable 을 실현 한 Fibonacci 생 성 기 를 만 듭 니 다.하나의 선택 은 이 종 류 를 다시 써 서 Iterable 인 터 페 이 스 를 실현 하도록 하 는 것 이다.그러나 우 리 는 항상 소스 코드 의 통제 권 을 가 질 수 없고, 반드시 이렇게 해 야 한다 면, 그렇지 않 으 면 우 리 는 클래스 를 다시 쓰 고 싶 지 않다.그리고 우 리 는 또 다른 선택 이 있 습 니 다. 어댑터 (adapter) 를 만들어 서 필요 한 인 터 페 이 스 를 만 드 는 것 입 니 다.
public class IterableFibonacci extends Fibonacci implements Iterable {

    private int n;

    public IterableFibonacci(int count) {
        this.n = count;
    }

    @Override
    public Iterator iterator() {
        return new Iterator() {
            @Override
            public boolean hasNext() {
                return n > 0;
            }

            @Override
            public Integer next() {
                n--;
                return IterableFibonacci.this.next();
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    public static void main(String[] args) {
        for (int i : new IterableFibonacci(18)) {
            System.out.print(i + " ");
        }
    }
}
// Outputs
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584

이곳 은 계승 을 통 해 어댑터 를 실현 했다.

좋은 웹페이지 즐겨찾기