6月更文挑战|设计模式 —— 迭代器模式

这是我参与更文挑战的第14天,活动详情查看:更文挑战

迭代器模式

迭代器模式也可以叫做游标模式,是行为设计模式之一,是对容器访问的一种方式。对于容器对象访问必然涉及到遍历算法,遍历的形式就是迭代器了。其在访问和容器之间插入迭代器,将容器和迭代功能隔离,容器类只需要维护自身内部数据,不关心遍历操作方法。

实战

Iterator代表迭代器接口,一共两个方法next获取下个容器内部成员,hasNext判断是否还有容器内部成员;ConcreteIterator是具体迭代器,具有一个cursor下标和list当做遍历时根据当前cursor获取下一个容器成员对象;Aggregate是容器接口,add可添加内部成员,remove可移除内部成员,获取迭代器iterator功能;ConcreteAggregate是具体容器类实现接口方法,这里主要是为了获取迭代器。当需要做遍历操作时获取到迭代器,内部已经实现了具体迭代器类,当调用next可通过下标获取到容器内部具体某个成员。


// 迭代器接口
public interface Iterator<T>{
    T next();
    boolean hasNext();
}
/// 具体迭代器
public class ConcreteIterator<T> implements Iterator<T>{
    private List<T> list = new ArrayList<T>();
    private int cursor = 0;
    
    public ConcreteIterator(List<T> list){
        this.list = list;
    }
    @override
    boolean hasNext(){
        return cursor != list.size();
    }
    
    @override
    public T next(){
        T obj = null;
        if(this.hasNext()){
            obj = this.list.get(cursor ++);
        }
        return obj;
    }    
}
// 容器接口
public interface Aggregate<T>{
    void add(T obj);
    void remove(T obj);
    Iterator<T> iterator();
};

/// 具体容器类
public class ConcreteAggregate<T> implements Aggregate<T>{
    private List<T> list = new ArrayList<T>();
    
    @override
    public void add(T obj){
        list.add(obj);
    }
    
    @override
    public void remove(T obj){
        list.remove(obj);
    }
    
    @override
    public Iterator<T> iterator(){
        return new ConcreteIterator<T>(list);
    }
}
/// 实现
Aggregate<String> a = new ConcreteAggregate<>();
a.add("1");
a.add("2");
a.add("3");
a.add("4");

Iterator<String> i = a.iterator();
while(i.hasNext()){
    ....
}
复制代码

总结

迭代器模式的优点:支持不同方式遍历一个容器对象,弱化容器和遍历算法之间的关系。

迭代器模式的缺点:设计模式的通病,增加类文件数量。

在开发语言中事实上它们的容器类都有相应的迭代器功能,高级语言基本都已经内置实现,对于开发者而言更多的是理解和了解如何去使用,并不需要自行开发实现迭代器了。开发者更多关注在某个业务场景使用哪种迭代器更合适,效率更高。

参考

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享