1.职责链模式 2.命令模式 3.迭代器模式 4.观察者模式 5.策略模式 6.模板方法模式 7.访问者模式 8.中介者模式 9.备忘录模式 10.状态模式
由于学习难度较大或相对用途较少 本章不会讲解7-10四种设计模式
接下来针对以上6种设计模式进行单独讲解
3 迭代器模式
3.1 定义
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。
聚合对象一般被用来存储一系列的数据。聚合对象拥有两个职责,一是存储数据,而是遍历数据。存储是聚合的基本职责,后者是聚合的访问规则。将遍历的行为从聚合对象中分离出来,封装在迭代器中。由迭代器来提供遍历聚合对象内部数据的行为,将简化聚合对象的设计。
3.2 UML图
从上面UML图中可以看出
Iterator为抽象迭代器,定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法。例如,用于获取第一个元素的first()方法,用于访问下一个元素的next()方法,用于判断是否还有下一个元素的hasNext()方法,用于获取当前元素的currentItem()方法等。在具体迭代器中将实现这些方法。
ConcreteIterator为具体的迭代器类,它实现了抽象迭代器接口,完成对聚合对象的遍历。
Aggregate为抽象聚合类,它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。
ConcreteAggregate为具体聚合类,它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。
3.3 代码实现
public abstract class Aggregate {
protected Iterator iterator;
public Aggregate() {
this.iterator = createIterator();
}
public abstract Iterator createIterator();
}
public class ConcreteAggregate extends Aggregate {
private List<Object> items;
public ConcreteAggregate(List<Object> items) {
super();
this.items = items;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(items);
}
}
public abstract class Iterator {
public abstract void first();
public abstract boolean hasNext();
public abstract Object next();
public abstract Object currentItem();
}
public class ConcreteIterator extends Iterator {
private List<Object> items;
private int currentIndex;
public ConcreteIterator(List<Object> items) {
this.items = items;
currentIndex = -1;
}
@Override
public void first() {
currentIndex = -1;
}
@Override
public boolean hasNext() {
return currentIndex < items.size() - 1;
}
@Override
public Object next() {
currentIndex++;
return items.get(currentIndex);
}
@Override
public Object currentItem() {
return items.get(currentIndex);
}
}
public class Client {
public static void main(String[] args) {
List<Object> items = Arrays.asList("item 1", "item 2", "item 3", "item 4");
ConcreteAggregate aggareate = new ConcreteAggregate(items);
Iterator iterator = aggareate.createIterator();
iterator.first(); // Move to the first item.
while (iterator.hasNext()) { // Iterate through all items.
Object item = iterator.next(); // Get the next item.
System.out.println(item);
}
}
}