52:교체 자 Iterator 모드

5386 단어 iterator
교체 서브 Iterator 모드 는 커서 모드 라 고도 부 르 며 대상 의 행위 모델 입 니 다.교체 서브 모드 는 모 여 있 는 요 소 를 순서대로 방문 할 수 있 으 며 모 여 있 는 내부 표상 을 노출 하지 않 아 도 됩 니 다.
자바 집합(Collection)대상 은 공 통 된 자바 util.collection 인 터 페 이 스 를 실현 하 는 대상 입 니 다.1.2 버 전부터 자바 언어 는 Vector,Array List,Queue,Stack,TreeSet,HashMap,TreeMap 등 여러 가지 집합 을 제공 합 니 다.그런데 왜 집합 하려 면 교체 자가 필요 합 니까?집합 대상 은 반드시 적당 한 방법 을 제공 해 야 한다.클 라 이언 트 가 하나의 선형 순서에 따라 모든 요소 대상 을 옮 겨 다 니 며 하나의 요소 대상 을 추출 하거나 삭제 할 수 있 도록 해 야 한다.집합 을 사용 하 는 시스템 은 반드시 이런 방법 으로 집합 대상 을 조작 하고 집합 을 사용 하 는 시스템 을 심화 시 키 는 과정 에서 두 가지 문제 가 발생 할 수 있다.
(1)교체 논 리 는 변 하지 않 았 지만 하나의 집합 을 다른 집합 으로 바 꿔 야 할 때 서로 다른 집합 에 서로 다른 인터페이스 가 있 기 때문에 클 라 이언 트 코드 를 수정 해 야 한다.
(2)모 이 는 것 은 변 하지 않 지만 교체 하 는 방식 은 바 뀌 어야 한다.예 를 들 어 원래 요 소 를 읽 고 삭제 하 는 것 만 있 었 는데 지금 요 소 를 걸 러 내 려 면 집적 대상 을 수정 하고 기 존의 옮 겨 다 니 는 방법 을 수정 할 수 밖 에 없다.이런 이 유 는 변 하지 않 는 구 조 를 시스템 에서 추상 적 으로 가 변 성분 과 분리 하지 않 았 기 때문이다.그리고 가 변 부분의 각종 실현 을 봉인 한다.교체 서브 모델 은 교체 논 리 를 하나의 독립 된 교체 서브 대상 에 봉 하여 집합 자체 와 분할한다.교체 대상 은 옮 겨 다 니 는 추상 화 이다.서로 다른 집적 대상 은 똑 같은 교체 대상 을 제공 하여 클 라 이언 트 가 모 이 는 바 텀 구 조 를 알 필요 가 없 게 한다.하나의 집적 은 여러 개의 서로 다른 교체 대상 을 제공 하여 논리 적 변 화 를 집적 대상 자체 에 영향 을 주지 않 게 한다.
다시 말 하면'개폐'원칙:개폐 원칙 은 시스템 이 기 존 코드 를 수정 하지 않 은 상태 에서 기능 의 확장 을 할 수 있 도록 요구한다.이 를 실현 하 는 경 로 는 바로 변화 에 대한 포장 이다.
(1)변화 에 대한 패 키 징 측면 에서 볼 때 교체 서브 모델 은 집적 요소 에 접근 하 는 논리 적 패 키 징 을 하고 이 를 집적 대상 의 패 키 징 에 독립 시 켰 다.이 는 저장 논리 와 교체 논리 가 독립 적 으로 변화 하 는 공간 을 제공 하여 시스템 의 재 활용 성 을 증가 시 켰 다.
(2)코드 의 재 구성 측면 에서 볼 때 교체 자 는 클 라 이언 트 와 집적 사이 에 중개 층 을 추가 하여 클 라 이언 트 와 집적 간 의 통신 을 직접적 으로 간접 적 으로 바 꾸 었 다.이렇게 하 는 장점 은 클 라 이언 트 가 집적 에 미 친 영향 과 집적 의 변화 가 클 라 이언 트 에 미 친 영향 을 완충 하 는 것 이다.
교체 서브 모드 는 다음 과 같은 몇 가지 역할 과 관련된다.
(1)추상 적 인 교체 자(Iterator)역할:이 추상 적 인 역할 은 요 소 를 옮 겨 다 니 는 데 필요 한 인 터 페 이 스 를 정의 합 니 다.
(2)구체 적 인 교체 자(Concrete Iterator)역할:이 역할 은 Iterator 인 터 페 이 스 를 실현 하고 교체 과정 에서 커서 위 치 를 유지 합 니 다.
(3)집합(Aggregate)캐릭터:이 추상 적 인 캐릭터 는 교체 자(Iterator)대상 을 만 드 는 인 터 페 이 스 를 제공 합 니 다.
(4)구체 적 인 집합(Concrete Aggregate)역할:교체 자(Iterator)대상 을 만 드 는 인 터 페 이 스 를 실현 하고 적당 한 구체 적 인 교체 자 인 스 턴 스 를 되 돌려 줍 니 다.
(5)클 라 이언 트(Client)역할:집합 과 교체 대상 에 대한 인용 을 가지 고 교체 대상 의 교체 인 터 페 이 스 를 호출 하 며 교체 서브 작업 을 통 해 요 소 를 모 으 는 증가 와 삭제 도 가능 합 니 다.
소스 코드 는 다음 과 같 습 니 다.
package cai.milenfan.basic.test; 
/*      ,                
  */ 
abstract public class Aggregate { 
public Iterator createIterator(){ 
       return null; 
   } 
} 
package cai.milenfan.basic.test; 
/* 
  *                      
  */ 
public interface Iterator { 
void first(); 
   void next(); 
   boolean isDone(); 
   Object currentItem(); 
} 
package cai.milenfan.basic.test; 

public class ConcreteAggregate extends Aggregate{ 
private Object objs[]= {"Monk Tang", 
       "Monkey", "Pigsy", 
       "Sandy", "Horse"}; 

   public Iterator createIterator(){ 
       return (Iterator) new ConcreteIterator(this); 
   } 

   public Object getElement(int index){ 
if (index < objs.length) 
       { 
return objs[index]; 
       } 
       else 
       { 
           return null; 
       } 
   } 

   public int size(){ 
return objs.length; 
   } 
} 
package cai.milenfan.basic.test; 

public class ConcreteIterator implements Iterator{ 
private ConcreteAggregate agg; 
private int index = 0; 
     private int size = 0; 

     public ConcreteIterator(ConcreteAggregate agg){ 
this.agg = agg; 
         size = agg.size(); 
         index = 0 ; 
     } 

     public void first(){ 
index = 0 ; 
     } 

     public void next(){ 
if (index < size){ 
index ; 
       } 
     } 

     public boolean isDone(){ 
         return (index >= size); 
     } 

     public Object currentItem(){ 
         return agg.getElement(index); 
     } 
} 
package cai.milenfan.basic.test; 

public class Client{ 
private Iterator it; 
   private Aggregate agg = new ConcreteAggregate(); 

   public void operation(){ 
       it = agg.createIterator(); 
       while( !it.isDone() ){ 
       System.out.println(it.currentItem().toString());
           it.next(); 
       } 
   } 

   public static void main(String[] args){ 
      Client client = new Client(); 
      client.operation(); 
   } 
} 
package cai.milenfan.basic.test; 

public class Client{ 
private Iterator it; 
   private Aggregate agg = new ConcreteAggregate(); 

   public void operation(){ 
       it = agg.createIterator(); 
       while( !it.isDone() ){ 
       System.out.println(it.currentItem().toString());
           it.next(); 
       } 
   } 

   public static void main(String[] args){ 
      Client client = new Client(); 
      client.operation(); 
   } 
}

좋은 웹페이지 즐겨찾기