범용 인터페이스
범 형 도 인터페이스 에 사용 할 수 있다. 예 를 들 어 생 성기 (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
이곳 은 계승 을 통 해 어댑터 를 실현 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.