设计模式之行为型模式(三)迭代器模式

58 阅读2分钟

1.职责链模式 2.命令模式 3.迭代器模式 4.观察者模式 5.策略模式 6.模板方法模式 7.访问者模式 8.中介者模式 9.备忘录模式 10.状态模式

由于学习难度较大或相对用途较少 本章不会讲解7-10四种设计模式

接下来针对以上6种设计模式进行单独讲解

3 迭代器模式

3.1 定义

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。

聚合对象一般被用来存储一系列的数据。聚合对象拥有两个职责,一是存储数据,而是遍历数据。存储是聚合的基本职责,后者是聚合的访问规则。将遍历的行为从聚合对象中分离出来,封装在迭代器中。由迭代器来提供遍历聚合对象内部数据的行为,将简化聚合对象的设计。

3.2 UML图

image.png

从上面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);
        }
    }
}