교체 기 모드 테스트
30816 단어 교체 기 모드
전재 출처 http://www.cnblogs.com/zrtqsk/p/3716173.html 를 밝 혀 주세요. 감사합니다!
소개
먼저 의 정 의 를 살 펴 보 자. 취 합 대상 의 각 요 소 를 순서대로 방문 하 는 방법 을 제공 하고 이 대상 의 내부 표 시 를 드 러 낼 필요 가 없다.
교체 기 모드 의 본질은 접근 집합 대상 의 요 소 를 제어 하 는 것 이다.
자바 에 있 는 취 합 대상 은 주로 Collection 류, Map 류 의 각 하위 클래스 대상 이다.마찬가지 로 배열 도 집합 대상 이 라 고 할 수 있다.교체 기 모드 는 외부 에서 같은 방식 으로 다른 집합 대상 에 접근 하 기 를 원 하 는 것 이다.이거 어떻게 하지?
말하자면 교체 류 를 만 들 고 취 합 대상 을 가지 고 이 취 합 대상 을 교체 하 는 방법 을 제공 하 는 것 이다.이 교체 류 는 어떻게 얻 을 수 있 습 니까?원래 의 취 합 대상 에 게 하나의 방법 을 추가 하면 교체 대상 을 되 돌려 주 고 돌아 갈 때 자신 을 이 교체 대상 에 게 전달 할 수 있다.우 리 는 이 교체 대상 을 얻 으 면 외부 에서 이 집적 대상 을 쉽게 방문 할 수 있다.
2. 나의 실현
1. 우리 자체 에 간단 한 기능 을 포함 하 는 집합 류 MyList 가 있다 고 가정 하면 다음 과 같다.
1 public class MyList<T> {
2
3 private Object[] elements;
4 //
5 private int capacity = 10;
6 //
7 private int size = 0;
8
9 //
10 public MyList(int capacity){
11 this.capacity = capacity;
12 elements = new Object[10];
13 }
14
15 //
16 public MyList(){
17 this(10);
18 }
19
20 public int size(){
21 return size;
22 }
23
24 public T get(int i){
25 if(i > capacity){
26 System.out.println("List ");
27 return null;
28 }else {
29 return (T) elements[i];
30 }
31 }
32
33 public void add(T obj){
34 if(size >= capacity){
35 //
36 }else {
37 elements[size ++] = obj;
38 }
39 }
40 }
2. 테스트 해 보기:
1 public class Test {
2
3 public static void main(String[] args)
4 {
5 MyList<Apple> list = new MyList<Apple>();
6 list.add(new Apple("a"));
7 list.add(new Apple("b"));
8 System.out.println(list.get(0));
9 System.out.println(list.get(1));
10 System.out.println(list.get(3));
11 }
12 }
13
14 class Apple{
15 private String name;
16
17 public Apple(String name){
18 this.name = name;
19 }
20
21 public String toString(){
22 return "Apple:" + name;
23 }
24
25 }
3. 결 과 는 다음 과 같다.
Apple:a
Apple:b
List
null
가시 기능 이 정상이다.
4. 우 리 는 외부 에서 이 집합 대상 을 방문 해 야 합 니 다. 어떻게 해 야 합 니까?
앞에서 말 한 바 와 같이 간단 한 접근 데이터 인 터 페 이 스 를 쓰 고 간단 한 교체 집합 대상 을 포함 하 는 기능 은 다음 과 같다.
1 public interface Iterator<T> {
2
3 public T next();
4
5 public boolean hasNext();
6 }
5. 간단 한 실현 류;
1 public class IteratorImpl<T> implements Iterator<T> {
2
3 private int index = 0;
4 MyList list = null;
5 public IteratorImpl(MyList list){
6 this.list = list;
7 }
8
9 @Override
10 public T next()
11 {
12 return (T) list.get(index++);
13 }
14
15 @Override
16 public boolean hasNext()
17 {
18 boolean flag = false;
19 if(list.get(index) != null){
20 flag = true;
21 }
22 return flag;
23 }
24 }
6. 간단 한 추상 류 AbstractList 를 구축 하고 실제 List 의 대부분 방법 은 이 추상 류 에 넣 을 수 있 습 니 다. 여기 서 프레젠테이션 의 편 의 를 위해 다음 과 같 습 니 다.
1 public abstract class AbstractList {
2
3 public abstract Iterator iterator();
4 }
7. 방금 MyList 는 이 추상 적 인 유형 을 계승 하고 그 실현 방법 은 다음 과 같다.
1 @Override
2 public Iterator iterator()
3 {
4 return new IteratorImpl(this);
5 }
아주 간단 해!
8. 다음은 우리 가 테스트 하 는 것 입 니 다. 테스트 유형 은 이전 보다 조금 바 뀌 었 습 니 다. 다음 과 같 습 니 다.
1 public class Test {
2
3 public static void main(String[] args)
4 {
5 MyList<Apple> list = new MyList<Apple>();
6 list.add(new Apple("a"));
7 list.add(new Apple("b"));
8 // System.out.println(list.get(0));
9 // System.out.println(list.get(1));
10 // System.out.println(list.get(3));
11 Iterator it = list.iterator();
12 while(it.hasNext()){
13 System.out.println(it.next());
14 }
15 }
16 }
9. 결 과 는 다음 과 같다.
Apple:a
Apple:b
취 합 된 대상 의 각 요 소 를 순서대로 방문 하 는 방법 을 제공 하고 이 대상 의 내부 표 시 를 노출 할 필요 가 없다.이것 이 바로 교체 기 모드 다.
3. 자바 의 교체 기
일반적으로, 우 리 는 집합 대상 을 옮 겨 다 니 며 Iterator 를 사용 하 는 것 외 에 더 간편 한 방법 이 있 습 니 다. 그것 은 간단 한 for 순환 - for (Type t: Collection) 입 니 다.그러나 우리 가 이 방식 으로 위의 내 가 정의 한 집합 대상 인 MyList 에 접근 할 때 컴 파일 오류 가 발생 했 습 니 다.자바. lang. Iterable 인 터 페 이 스 를 실현 하지 못 했 기 때 문 입 니 다.이 인 터 페 이 스 는 java. lang 패키지 아래 에 있 습 니 다. 이것 은 우리 가 추가 패 키 지 를 사용 하지 않 아 도 된다 는 것 을 의미 합 니 다.우 리 는 이 인터페이스의 소스 코드 를 살 펴 보 자.
package java.lang;
import java.util.Iterator;
public interface Iterable<T> {
Iterator<T> iterator();
}
이 인 터 페 이 스 는 자바 util. Iterator 인터페이스 대상 을 되 돌려 주 는 방법 이 하나 밖 에 없다 는 것 을 알 수 있다.우리 가 방금 한 추상 류 에 해당 한다.
자바 의 교체 기 는 주로 이 두 인 터 페 이 스 를 둘러싸 고 있 습 니 다. 자바 util. Iterator 의 소스 코드 를 살 펴 보 겠 습 니 다.
package java.util;
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
이 인 터 페 이 스 는 매우 간단 하 다 는 것 을 알 수 있다.위 에서 내 가 정의 한 Iterator 에 비해 void reove () 방법 이 하나 더 생 겼 을 뿐이다.
아래 에서 우 리 는 위의 예 를 자바 의 교체 기로 바 꾸 어 실현 한다.일반적으로 Iterator 의 실현 류 는 집합 대상 에 대응 하기 때문이다.내부 집적 성 을 높이 기 위해 서 는 Iterator 실현 류 를 집적 대상 의 내부 류 로 해 야 한다.JK 도 그 랬 어 요.다음 과 같다.
1 import java.util.Iterator;
2
3 // Iterable
4 public class MyList<T> implements Iterable<T>{
5
6 private Object[] elements;
7 //
8 private int capacity = 10;
9 //
10 private int size = 0;
11
12 //
13 public MyList(int capacity)
14 {
15 this.capacity = capacity;
16 elements = new Object[10];
17 }
18
19 //
20 public MyList()
21 {
22 this(10);
23 }
24
25 public int size()
26 {
27 return size;
28 }
29
30 public T get(int i)
31 {
32 if (i > capacity)
33 {
34 System.out.println("List ");
35 return null;
36 }
37 else
38 {
39 return (T) elements[i];
40 }
41 }
42
43 public void add(T obj)
44 {
45 if (size >= capacity)
46 {
47 //
48 }
49 else
50 {
51 elements[size++] = obj;
52 }
53 }
54
55 // java.util.Iterator
56 @Override
57 public Iterator iterator()
58 {
59 return new IteratorImpl(this);
60 }
61
62 //
63 class IteratorImpl<T> implements Iterator<T> {
64
65 private int index = 0;
66 MyList list = null;
67
68 public IteratorImpl(MyList list)
69 {
70 this.list = list;
71 }
72
73 @Override
74 public T next()
75 {
76 return (T) list.get(index++);
77 }
78
79 @Override
80 public boolean hasNext()
81 {
82 boolean flag = false;
83 if (list.get(index) != null)
84 {
85 flag = true;
86 }
87 return flag;
88 }
89
90 @Override
91 public void remove()
92 {
93
94 }
95 }
96 }
이 동시에 우 리 는 간단 한 for 순환 으로 이 집적 대상 을 교체 할 수 있다. 다음 과 같다.
1 public class Test {
2
3 public static void main(String[] args)
4 {
5 MyList<Apple> list = new MyList<Apple>();
6 list.add(new Apple("a"));
7 list.add(new Apple("b"));
8 // System.out.println(list.get(0));
9 // System.out.println(list.get(1));
10 // System.out.println(list.get(3));
11 Iterator it = list.iterator();
12 for(Apple a : list ){
13 System.out.println(a);
14 }
15 }
16 }
결 과 는 이전 과 별 반 다 르 지 않다.