교체 기 모드 테스트

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 }

결 과 는 이전 과 별 반 다 르 지 않다.
 
 
 

좋은 웹페이지 즐겨찾기