设计模式(十四)迭代器模式(Iterator)-行为型

来源:互联网 发布:金山数据恢复免费 编辑:程序博客网 时间:2024/04/28 18:31

大清晨,发一篇博文提提神吧。

迭代器模式(Iterator)

在软件开发过程中,经常需要将某一类的对象放在一个集合里,或者放在容器里,这个时候通常需要对集合或容器里的对象进行访问,很明显,对容器或集合里的对象访问必然涉及遍历,这就是迭代器模式。

迭代模式实现原理图

这里写图片描述
迭代器模式实现原理图

实现

迭代器角色负责定义访问和遍历元素的接口,它的示例代码如下:
Iterator.java

public interface Iterator {    void Next();    void First();    void Currentitem();    void IsDone();}

具体迭代器角色实现迭代器接口,并要记录中的当前位置,示意代码如下:
ConcreteIterator.java

package com.devin.iterator; /**  * @author 作者:ldw E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 下午12:57:20  * 类说明  */public class ConcreteIterator implements Iterator{    private ConcreteAggregate concreteAggregate;    @Override    public void Next() {    }    @Override    public void First() {    }    @Override    public void Currentitem() {    }    @Override    public void IsDone() {    }}

容器角色负责提供创建具体迭代器角色的接口,示意代码如下:
Aggregate.java

public interface Aggregate {    Iterator createIterator();}

具体容器角色实现创建具体迭代器角色的接口,这个具体迭代器角色和该容器的结构相关,它的示意代码如下:
ConcreteAggregate.java

public class ConcreteAggregate implements Aggregate{    @Override    public Iterator createIterator() {        return new ConcreteIterator();     }}

具体实例

迭代器模式在公交售票系统的使用

对于公交售票系统来说,不管是谁上车,都要刷卡的,每张卡里有多少金额,刷卡的里程都是要通过系统进行判断的。此时使用迭代器模式就比较好,首先定义公交车类:
公交车类Bus.java

package com.devin.iterator.test; /**  * @author  作者:ldw  E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 下午1:14:48  * 类说明  */public class Bus {    private String name;    public Bus(String name){        this.name = name;    }    public String getName(){        return name;    }}

定义迭代器类Iterator.java

package com.devin.iterator.test; /**  * @author  作者:ldw  E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 下午1:15:38  * 类说明  */public interface Iterator {    public boolean hasNext();    public Object next();}

定义迭代器的公交车类BusIterator.java

package com.devin.iterator.test; /**  * @author  作者:ldw  E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 下午1:16:29  * 类说明  */public class BusIterator implements Iterator {    private BusList list;    private int count;    public BusIterator(BusList list) {        this.list = list;        this.count = list.count();    }    @Override    public boolean hasNext() {        boolean flag = true;        if(count==0){            flag = false;        }else {            flag = true;        }        return flag;    }    @Override    public Object next() {        Bus bus;        bus = list.getList().get(--count);        return bus;    }}

定义公交的集合类BusList.java

package com.devin.iterator.test; import java.util.ArrayList;import java.util.List;/**  * @author  作者:ldw  E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 下午1:16:55  * 类说明  */public class BusList {    private List<Bus> list = new ArrayList<Bus>();    private int count;    public void add(Bus bus){        list.add(bus);        count++ ;     }    public void remove(Bus bus) {        list.remove(bus);        count--;    }    public int count(){        return count;    }    public List<Bus> getList(){        return list;    }    public Iterator createIterator(){        return new BusIterator(this);    }}

Client.java

package com.devin.iterator.test;/** * @author 作者:ldw E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 下午1:23:13 类说明 */public class Client {    public static void main(String[] args) {        Bus bus1 = new Bus("张三那");        Bus bus2 = new Bus("lisi");        BusList busList = new BusList();        busList.add(bus1);        busList.add(bus2);        Iterator it = busList.createIterator();        while(it.hasNext()){            System.out.println(((Bus)it.next()).getName());        }    }}
1 0
原创粉丝点击