设计模式GOF23——迭代器模式

来源:互联网 发布:知乎电脑客户端 编辑:程序博客网 时间:2024/06/09 21:07

迭代器模式(iterator),又称为游标(cursor)模式,是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。

模式的职责

提供一种可以遍历聚合对象的方式。

模式的结构

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

模式的实现

public interface MyIterator {    void first();//将游标指向第一个元素()    void next();//将游标指向下一个元素    Object getCurrentObj();    boolean hasNext();//判断是否有下一个元素    //这两个可以有也可以没有    boolean isfirst();//判断是否是第一个元素    boolean isLast();//判断是否是最后一个元素}public class ConcreteMyaggregate {    //承载需要迭代的容器    private List<Object> list = new ArrayList<Object>();    public ConcreteMyaggregate(List<Object> list){        super();        this.list =list;    }    public void addObject(Object obj){        list.add(obj);    }    public void removeObject(Object obj){        list.remove(obj);    }    public List<Object> getList() {        return list;    }    public void setList(List<Object> list) {        this.list = list;    }    //外部获得迭代器的类的方法    public MyIterator createIterator(){        return new ConcreteItertor();    }    //使用内部类定义迭代器,可以直接使用外部类的属性    private class ConcreteItertor implements MyIterator{        //迭代器的游标        private int cursor;        public void first() {            cursor = 0;        }        //迭代器的真正实现        public Object getCurrentObj() {            return list.get(cursor);        }        public boolean hasNext() {            if(cursor<list.size()){                return true;            }            return false;        }        public boolean isLast() {            return cursor == (list.size()-1)?true:false;        }        public boolean isfirst() {            return cursor == 0?true:false;        }        public void next() {            if(cursor<list.size())            cursor++;        }    }}//客户端调用public class Client {    public static void main(String[] args) {        //创建容器,往容器中放入对象        ConcreteMyaggregate cma = new ConcreteMyaggregate(null);        cma.addObject("a");        cma.addObject("b");        cma.addObject("c");        //创建迭代器,取出对象        MyIterator iter = cma.createIterator();        //只要还有对象,就取出对象,并把游标往下一个        while(iter.hasNext()){            System.out.println(iter.getCurrentObj());            iter.next();        }    }}

其他说明

这个实现案例是用正向遍历的迭代器,其实也可以实现逆向遍历的迭代器(就是每次都把游标向前一位的那种)。
JDK内置的迭代器(List/Set)里面也是用的这种方式。

0 0