迭代器与组合模式

《headfirst设计模式》

迭代器模式:

提供一种方法顺序访问一个局和对象中的各个元素,而又不暴露其内部的表示。

image

(1)自定义迭代器interface。需要使用迭代器的类implements这个接口。

interface Iterator

{

//需要有的最基本的两个操作

Object next();

boolean hasNest();

//可选的

void remove();

}

(2)java提供的迭代器接口java.util.Iterator

***********

内部迭代器:由迭代器自己自己控制,自行在元素之间游走,因此必须告诉迭代器在游走的过程中要做些什么,也就是说,要将操作传入到迭代器。

外部迭代器:客户端通过使用next()获得下一个元素。

相比较,外部迭代器比内部迭代器更有弹性。

迭代器取出元素并没有次序,只是依次取出所有元素,并不能根据取出先后次序判断元素大小次序。

组合模式:

允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能够让客户以一致的方式处理个别对象以及组合对象。

在实现组合模式是后需要根据需要平衡透明性和安全性。

image

组合迭代器(△)

这里面的next和hasNest用到Stack来递归,这部分有点绕,看了半天,花图才明白。

////////////////////////下面代码记录下

public class CompositeIterator implements Iterator {
    Stack stack = new Stack();//堆栈内每个元素都是一个迭代器
    public CompositeIterator(Iterator iterator) {
        stack.push(iterator);
    }
    public Object next() {
        if (hasNext()) {
            Iterator iterator = (Iterator) stack.peek();//查看栈顶元素,并没有弹出栈
            MenuComponent component = (MenuComponent) iterator.next();//取出栈顶元素下一个元素
            if (component instanceof Menu) {
                stack.push(component.createIterator());
            }
            return component;
        } else {
            return null;
        }
    }
    public boolean hasNext() {
        if (stack.empty()) {
            return false;
        } else {
            Iterator iterator = (Iterator) stack.peek();
            if (!iterator.hasNext()) {
                stack.pop();//此时的栈顶元素下面已经没有子节点或者子节点已经被遍历过了,就删除这个子节点
                return hasNext();//然后递归插线下个栈顶元素
            } else {
                return true;
            }
        }
    }
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

*******

这一章提出了一个新的设计原则:一个类应该只有一个引起变化的原因。

原文地址:https://www.cnblogs.com/growup/p/1988851.html