17. 23种经典设计模式-311-迭代器模式

1. 迭代器模式(Iterator Pattern)

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(提供一种方法访问一个容器对象的各个元素,而又不需要暴露该对象的内部细节)

迭代模式是一种濒临废弃的方式, 大部分编程语言对迭代器均已提供了实现, 如Java 中的Iterator 接口. 因此一般不推荐在项目中使用迭代器模式

1.1 迭代器模式-核心

  • 迭代器的目的是提供一种方法熟悉怒访问一个聚合对象中的各个元素,而无须暴露该对象的内部实现细节.

1.2 迭代器模式-类图

迭代器共有四个角色:

  • Iterator: 抽象迭代器, 定义遍历元素的接口
  • ConcreteIterator: 具体迭代器. 实现遍历接口, 完成容器遍历
  • Aggregate: 抽象容器角色. 负责创建具体迭代器角色的接口
  • ConcreateAggrate: 具体容器角色. 具体容器实现容器接口定义的方法, 创建除容纳迭代器的对象.

[外链图片转存失败(img-L2DnAytm-1566895278375)(https://raw.githubusercontent.com/zongf0504/blog-images/master/images/design-parttern/ldp-iterator-01.png)]

2. 迭代器模式实现

由于迭代器模式濒临废弃,因此笔者就给出一个简单的通用实现即可.

2.1 Iterator

public interface Iterator {

    public Object next();

    public boolean hasNext();

    public boolean remove();

}

2.2 ConcreteIterator


import java.util.Vector;

public class ConcreteIterator implements Iterator {

    private Vector vector = new Vector();

    // 记录当前游标
    public int cursor = 0;

    public ConcreteIterator(Vector vector) {
        this.vector = vector;
    }

    @Override
    public Object next() {
        Object result = null;
        if (this.hasNext()) {
            result = this.vector.get(this.cursor++);
        }
        return result;
    }

    @Override
    public boolean hasNext() {
        if (this.cursor == this.vector.size()) {
            return false;
        }else {
            return true;
        }
    }

    @Override
    public boolean remove() {
        this.vector.remove(this.cursor);
        return true;
    }
}

2.3 Aggregate

public interface Aggregate {

    // 添加元素
    public void add(Object object);

    // 删除元素
    public void remove(Object object);

    // 由迭代器遍历所有的元素
    public Iterator iterator();
}

2.4 ConcreteAggregate

public class ConcreteAggregate implements Aggregate {

    private Vector vector = new Vector();

    @Override
    public void add(Object object) {
        this.vector.add(object);
    }

    @Override
    public void remove(Object object) {
        this.vector.remove(object);
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this.vector);
    }
}

2.5 测试

@Test
public void test() {

    Aggregate aggregate = new ConcreteAggregate();

    aggregate.add("aaa");
    aggregate.add(1234);
    aggregate.add("ccc");


    Iterator iterator = aggregate.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}
发布了321 篇原创文章 · 获赞 676 · 访问量 147万+

猜你喜欢

转载自blog.csdn.net/zongf0504/article/details/100103508
今日推荐