[设计模式] 浅谈迭代器模式

2024 年 6 月 5 日 星期三
/ ,
46

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

[设计模式] 浅谈迭代器模式

迭代器模式

模式功能说明:不同种类的对象可能需要不同的遍历方式,我们对每一种类型的对象配一个迭代器。

案例

//定义迭代器接口
interface Iterator {
    boolean hasNext();
    Object next();
}

//定义容器接口
interface Container {
    Iterator getIterator();
}

//实现容器接口的具体类
class NameRepository implements Container {
    public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};

    @Override
    public Iterator getIterator() {
        return new NameIterator();
    }

    private class NameIterator implements Iterator {
        int index;

        @Override
        public boolean hasNext() {
            if(index < names.length){
                return true;
            }
            return false;
        }

        @Override
        public Object next() {
            if(this.hasNext()){
                return names[index++];
            }
            return null;
        }        
    }
}

//使用
public class IteratorPatternDemo {
    public static void main(String[] args) {
        NameRepository namesRepository = new NameRepository();

        for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
            String name = (String)iter.next();
            System.out.println("Name : " + name);
        }  
    }
}

我们首先定义了一个迭代器接口(Iterator)和一个容器接口(Container)。然后我们创建了一个具体的容器(NameRepository),它实现了Container接口,并内部定义了一个具体的迭代器(NameIterator),它实现了Iterator接口。最后,在客户端代码中,我们使用这个具体的容器和迭代器来遍历所有的元素。

使用场景:

  • 访问一个聚合对象的内容而无需暴露它的内部表示。
  • 需要为聚合对象提供多种遍历方式。
  • 为遍历不同的聚合结构提供一个统一的接口。

优缺点

优点:

  1. 它支持以不同的方式遍历一个聚合对象。
  2. 迭代器简化了聚合类。
  3. 在同一个聚合上可以有多个遍历。
  4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无需修改原有代码。

缺点:

  1. 由于迭代器模式遵循了“单一职责原则”,即一个类应该只有一个引起变化的原因。在这个模式中,迭代的逻辑被放在了迭代器类中,而不是在容器类中。

总结

状态模式实现了设计原则中的“开闭原则”,即对扩展开放,对修改关闭。在状态模式中,我们可以通过添加新的状态类来增加新的状态和转换,而不是修改已有的代码。 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...