簡體   English   中英

Java-使用策略實現迭代器

[英]Java - implement iterator with strategy

我正在嘗試為復合類實現自定義迭代器,並在迭代器實現中使用不同的策略,具體取決於客戶端希望如何遍歷復合結構。

public class MyComposite implements Iterable<MyComponent> {

    ArrayList<MyComponent> childComponents;

    //MyComposite methods

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

我想將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
}

我正在嘗試學習如何利用設計模式,所以也許我過於籠統了。 如何將策略完全注入迭代器?

MyIterator更改為實現Iterable<MyComponent> ,而不是Iterator (為清楚起見,您可能希望將其重命名為MyComponentScanner的名稱。)

public Iterator<MyComponent> iterator()方法從MyComposite類移至MyIterator (或任何您重命名的方法)。

例...

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM