2017-11-12 15 views
0

복합 클래스에 대한 사용자 정의 반복기를 구현하고 클라이언트가 복합 구조를 트래버스하는 방법에 따라 반복기 구현에서 다른 전략을 사용하려고합니다.Java - 전략을 사용하여 반복자를 구현하십시오.

public class MyComposite implements Iterable<MyComponent> { 

    ArrayList<MyComponent> childComponents; 

    //MyComposite methods 

    @Override 
    public Iterator<MyComponent> iterator() { 
     return new MyIterator(this); 
    } 
} 

I는 반복자 구조의 일부로서 MyIteratorStrategy 오브젝트를 전달하지만 Iterable 인터페이스는 iterator있어서 지나가는 객체를 허가하지 않는 싶다. 여기

public class SomeClient { 
    private void traverseComposite() { 
     MyComposite myComposite = new MyComposite(); 

     MyIteratorStrategy fooStrategy = new MyIteratorStrategy("foo"); 
     MyIteratorStrategy barStrategy = new MyIteratorStrategy("bar"); 

     MyIterator fooIterator = myComposite.iterator(fooStrategy); 
     MyIterator barIterator = myComposite.iterator(barStrategy);  
    } 
} 

내가 반복자의 구현 전략을 활용하고있어 방법 : 난 그렇게 아마도 내가 너무 일반적되고있어, 디자인 패턴을 활용하는 방법을 배울려고

public class MyIterator implements Iterator<MyComponent> { 

    MyComponent component; 
    MyIteratorStrategy strategy; 

    public MyIterator(MyComponent component, MyIteratorStrategy strategy) { 
     this.component = component; 
     this.strategy = strategy; 
    } 

    @Override 
    public Component next() { 
     if(strategy.isDone(component) { 
      //return some child component 
     } else { 
      //return some other child component 
     } 
    } 

    //rest of implementation 
} 

. 전략을 반복자에 명확하게 주입하려면 어떻게해야합니까?

+0

나는이 질문을 downvoted했다. 우리는 코드가 기대하는 바가 무엇인지, 왜 그렇게 할 것이라고 기대하는지, 실제로 무엇을하는지, 그리고 왜 잘못되었는지를 예상합니다. 제발이 정보를 포함하도록 질문을 편집 한 다음, 내 downvote를 철회하는 것을 고려할 것입니다. 참고 : [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve) –

+0

@JoeC 제 질문은 명확하게 위에 게시 된 코드의 문제점을 설명합니다. "나는 통과하려고합니다. 'MyIteratorStrategy' 객체를 반복자 생성의 일부로 ** ** 그러나 Iterable 인터페이스는 객체를 반복자 메소드에 전달할 수 없습니다. ** " – mk62

+0

그러면 Iterable 이 구현할 올바른 인터페이스인지 다시 생각해야한다고 생각합니다 . –

답변

0

대신 Iterable<MyComponent>을 구현하는 클래스가되도록 MyIterator을 변경하십시오. (당신은 그것을 명확성을 위해 MyComponentScanner 같은 이름을 변경 할 수 있습니다.)

MyIteratorMyComposite 클래스에서 public Iterator<MyComponent> iterator() 방법을 통해 이동

(또는 당신이 그것을 이름을 무엇이든). 당신이 그것을 잘못이 무엇인지 지정하지 않고 여기에 코드를 게시 한 때문에

예 ...

public class MyComponentScanner implements Iterable<MyComponent> { 

    MyComponent component; 
    MyIteratorStrategy strategy; 

    public MyComponentScanner(MyComponent component, MyIteratorStrategy strategy) { 
     this.component = component; 
     this.strategy = strategy; 
    } 

    @Override 
    public Iterator<MyComponent> iterator() { 
     return new Iterator() { 
      @Override 
      public Component next() { 
       if(strategy.isDone(component) { 
        //return some child component 
       } else { 
        //return some other child component 
       } 
      } 
     }; 
    } 

    //rest of implementation 
}