2017-11-12 5 views
0

Ich versuche, einen benutzerdefinierten Iterator für eine zusammengesetzte Klasse zu implementieren und verschiedene Strategien in der Iteratorimplementierung zu verwenden, abhängig davon, wie der Client die Verbundstruktur durchqueren möchte.Java - Implementiere Iterator mit Strategie

public class MyComposite implements Iterable<MyComponent> { 

    ArrayList<MyComponent> childComponents; 

    //MyComposite methods 

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

Ich mag ein MyIteratorStrategy Objekt als Teil der Iterators Konstruktion passieren, aber die Schnittstelle Iterable nicht Weitergabe der Objekte iterator Verfahren ermöglichen.

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);  
    } 
} 

Hier ist, wie ich die Strategie in der Iterator Implementierung bin Verwendung:

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 
} 

Ich versuche zu lernen, wie Design-Muster zu verwenden, so vielleicht zu allgemein ist mir zu sein. Wie kann ich die Strategie sauber in den Iterator einfügen?

+0

Ich habe diese Frage, weil Sie Downvoted Code hier ohne Angabe was falsch ist gebucht haben. Wir erwarten zu sehen, was Sie erwarten, dass der Code tut, warum Sie erwarten, dass es das tut, was es tatsächlich macht und warum es falsch ist. Bitte [bearbeiten] Sie Ihre Frage, um diese Informationen einzubeziehen, und dann werde ich in Betracht ziehen, meinen Downvote zurückzuziehen. Siehe: [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) –

+0

@JoeC Meine Frage gibt eindeutig an, was mit dem oben angegebenen Code falsch ist - "Ich würde gerne bestehen ein 'MyIteratorStrategy'-Objekt als Teil der Iterator-Konstruktion, ** jedoch erlaubt die Iterable-Schnittstelle kein Übergeben von Objekten an die Iterator-Methode. **" – mk62

+0

Dann denke ich, dass Sie erneut überdenken müssen, ob 'Iterable ' die richtige Schnittstelle ist . –

Antwort

0

Ändern Sie , um die Klasse zu sein, die Iterable<MyComponent> statt Iterator implementiert. (Vielleicht möchten Sie es für Klarheit etwas wie MyComponentScanner umbenennen.)

Bewegen Sie den public Iterator<MyComponent> iterator() Methode über von der MyComposite Klasse MyIterator (oder was auch immer Sie benennen Sie es).

Beispiel ...

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 
}