首页 > 其他 > 详细

设计模式--迭代器模式

时间:2020-02-17 22:27:07      阅读:60      评论:0      收藏:0      [点我收藏+]

迭代器模式

定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。提供一种可以遍历聚合对象的方式。又称为游标模式。

   聚合对象:存储数据。迭代器:遍历数据

角色

1)抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。

2)具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。

3)抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。

4)具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

图示:技术分享图片

 

package com.offcn.designpattern.iteratorpattern;

import java.util.ArrayList;
import java.util.List;

public class IteratorDemo {
    public static void main(String[] args) {
        ConcreteAggregate cag = new ConcreteAggregate();
        cag.addObject("aa");
        cag.addObject("bb");
        cag.addObject("cc");
        MyIterator interator = cag.createInterator();
        while (interator.hasNext()){
            System.out.println(interator.getCurrentObj());
            interator.next();
        }

    }
}
//自定义的聚合类
class ConcreteAggregate{
    private List<Object> list = new ArrayList<>();

    public void addObject(Object object){
        this.list.add(object);
    }
    public void remove(Object object){
        this.list.remove(object);
    }

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }
    public MyIterator createInterator(){
        return new ConcreteIterator();
    }
    //使用内部类定义迭代器,可以直接使用外部类的属性
    private class ConcreteIterator implements MyIterator{
        private int cursor;//定义游标的位置
        @Override
        public void first() {
            cursor = 0;
        }

        @Override
        public void next() {
            if(cursor < list.size()){
                cursor++;
            }
        }

        @Override
        public boolean hasNext() {
            if(cursor < list.size()){
                return true;
            }
            return false;
        }

        @Override
        public boolean isFirst() {
            return cursor == 0;
        }

        @Override
        public boolean isLast() {
            return cursor == (list.size()-1);
        }

        @Override
        public Object getCurrentObj() {
            return list.get(cursor);
        }
    }
}
//自定义迭代器接口
interface MyIterator{
    void first();
    void next();
    boolean hasNext();
    boolean isFirst();
    boolean isLast();
    Object getCurrentObj();//获取当前游标的对象
}

输出:

技术分享图片

优点

1)访问一个聚合对象的内容而无须暴露它的内部表示。

2)遍历任务交由迭代器完成,这简化了聚合类。

3)它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。

4)增加新的聚合类和迭代器类都很方便,无须修改原有代码。

5)封装性良好,为遍历不同的聚合结构提供一个统一的接口。

 

缺点:增加了类的个数,这在一定程度上增加了系统的复杂性。

 

应用场景

1)当需要为聚合对象提供多种遍历方式时。

2)当需要为遍历不同的聚合结构提供一个统一的接口时。

3)当访问一个聚合对象的内容而无须暴露其内部细节的表示时。

 

设计模式--迭代器模式

原文:https://www.cnblogs.com/bai3535/p/12323791.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!