⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compositeiterator.java

📁 java设计模式源码
💻 JAVA
字号:
package com.oozinoz.iterator;

/*
 * Copyright (c) 2001, 2005. Steven J. Metsker.
 * 
 * Steve Metsker makes no representations or warranties about
 * the fitness of this software for any particular purpose, 
 * including the implied warranty of merchantability.
 *
 * Please use this software as you wish with the sole
 * restriction that you may not claim that you wrote it.
 */

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import com.oozinoz.process.ProcessComponent;

public class CompositeIterator extends ComponentIterator {
    protected Object peek;
    protected Iterator children;
    protected ComponentIterator subiterator;

    public CompositeIterator(Object head, List components, Set visited) {
        super(head, visited);
        children = components.iterator();
    }

    public int getDepth() {
        if (subiterator != null) 
            return subiterator.getDepth() + 1;
        return 0;
    }

    public boolean hasNext() {
        if (peek == null) 
            peek = next();
        return peek != null;
    }

    public Object next() {
        if (peek != null) {
            Object result = peek;
            peek = null;
            return result;
        }
        
        if (!visited.contains(head)) {
            visited.add(head);
            if (shouldShowInterior()) return head;
        }
        
        return nextDescendant();
    }

    /*
     * Usually just return the subiterator's next element. But if the
     * subiterator doesn't exist or doesn't have a next element, create an
     * iterator for the next child. (If there is no next child, just return
     * null.) Create an iterator for this child and return this iterator's next
     * element.
     */
    protected Object nextDescendant() {
        while (true) {
            if (subiterator != null) {
                if (subiterator.hasNext()) return subiterator.next();
            }

            if (!children.hasNext()) return null;

            ProcessComponent pc = (ProcessComponent) children.next();
            if (!visited.contains(pc)) {
                subiterator = pc.iterator(visited);
                subiterator.setShowInterior(shouldShowInterior());
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -