《headfirst设计模式》
迭代器模式:
提供一种方法顺序访问一个局和对象中的各个元素,而又不暴露其内部的表示。
(1)自定义迭代器interface。需要使用迭代器的类implements这个接口。
interface Iterator
{
//需要有的最基本的两个操作
Object next();
boolean hasNest();
//可选的
void remove();
}
(2)java提供的迭代器接口java.util.Iterator
***********
内部迭代器:由迭代器自己自己控制,自行在元素之间游走,因此必须告诉迭代器在游走的过程中要做些什么,也就是说,要将操作传入到迭代器。
外部迭代器:客户端通过使用next()获得下一个元素。
相比较,外部迭代器比内部迭代器更有弹性。
迭代器取出元素并没有次序,只是依次取出所有元素,并不能根据取出先后次序判断元素大小次序。
组合模式:
允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能够让客户以一致的方式处理个别对象以及组合对象。
在实现组合模式是后需要根据需要平衡透明性和安全性。
组合迭代器(△)
这里面的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();
}
}
*******
这一章提出了一个新的设计原则:一个类应该只有一个引起变化的原因。