迭代器模式(Iterator)(对象行为型模式)

参考文档:

1.设计模式-可复用面向对象软件的基础


迭代器模式(Iterator)(对象行为型模式)

理论方面的知识,在网上,实在是没有找到好的博客,我把书中的内容贴出来给大家参考一下。






























书中案例代码实现:
外部迭代器实现:

AbstractList.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public abstract class AbstractList<T> {

    public abstract Iterator<T> createIterator();
}
List.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public class List<T> extends AbstractList {
    private T[] _ts;
    private long _size = Integer.MAX_VALUE;

    public List(long size) {
        this._size = size;
    }

    public List(List<T> list) {
        _ts = list._ts;
        _size = list._size;
    }

    public List() {
    }

    public long count() {
        return _ts.length;
    }

    public T get(int current) {
        if (_ts.length > current) {
            return _ts[current];
        }
        return null;
    }

    public void add(T[] ts) {
        _ts = ts;
    }

    @Override
    public Iterator createIterator() {
        return new ListIterator(this);
    }
}
Iterator.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public abstract class Iterator<T> {

    abstract void first();

    abstract void next();

    abstract boolean isDone();

    abstract T currentItem();

}
ListIterator.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public class ListIterator<T> extends Iterator {
    private List<T> _list;
    private long _current;

    ListIterator(List<T> list) {
        _list = list;
        _current = 0;
    }

    @Override
    void first() {
        _current = 0;
    }

    @Override
    void next() {
        _current++;
    }

    @Override
    boolean isDone() {
        return _current >= _list.count();
    }

    @Override
    T currentItem() {
        if (isDone()) {
            throw new NullPointerException("iterator is stop ");
        }
        return _list.get((int) _current);
    }
}
ReverseListIterator.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public class ReverseListIterator<T> extends Iterator {
    private List<T> _list;
    private long _current;

    ReverseListIterator(List<T> list) {
        _list = list;
        _current = _list.count() - 1;
    }

    @Override
    void first() {
        _current = _list.count() - 1;
    }

    @Override
    void next() {
        _current--;
    }

    @Override
    boolean isDone() {
        return _current < 0;
    }

    @Override
    Object currentItem() {
        if (isDone()) {
            return new NullPointerException("iterator is stop");
        }
        return _list.get((int) _current);
    }
}
Employee.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public class Employee {
    private String name;

    public Employee(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "My name is " + name;
    }
}

Client.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public class Client {

    public static void main(String[] args) {
        List<Employee> employees = new List<Employee>();
        Employee[] employees1 = new Employee[]{
                new Employee("a"),
                new Employee("b"),
                new Employee("c"),
                new Employee("d"),
                new Employee("e")
        };
        employees.add(employees1);
        //外置迭代器实现
        ListIterator listIterator = new ListIterator(employees);
        ReverseListIterator reverseListIterator = new ReverseListIterator(employees);
        printEmployees(listIterator);
        listIterator = null;

        System.out.println("-----------------");
        printEmployees(reverseListIterator);
        reverseListIterator = null;

        //外置迭代器,工厂方法实现
        Iterator iterator = employees.createIterator();
        System.out.println("-----------------");
        printEmployees(iterator);
        iterator = null;


        System.out.println("-----------------");
        //内置迭代器实现
        PrintNEmployees printNEmployees = new PrintNEmployees(employees, 2);
        printNEmployees.traverser();

    }


    public static void printEmployees(Iterator<Employee> iterator) {
        for (iterator.first(); !iterator.isDone(); iterator.next()) {
            System.out.println(iterator.currentItem().toString());
        }
    }

}
内置迭代器实现:
ListTraverser.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public abstract class ListTraverser<T> {
    private ListIterator<T> _listIterator;

    public ListTraverser(List<T> _list) {
        this._listIterator = new ListIterator<T>(_list);
    }

    public boolean traverser() {
        boolean result = false;
        for (_listIterator.first(); !_listIterator.isDone(); _listIterator.next()) {
            result = processItem(_listIterator.currentItem());
            if (result == false) {
                break;
            }
        }
        return result;
    }

    protected abstract boolean processItem(T t);


}
PrintNEmployees.java:
package com.rick.designpattern.iterator;

/**
 * Created by MyPC on 2017/6/28.
 */
public class PrintNEmployees extends ListTraverser<Employee> {
    private int _total, _count;

    public PrintNEmployees(List<Employee> _list, int n) {
        super(_list);
        _total = n;
        _count = 0;
    }

    @Override
    protected boolean processItem(Employee employee) {
        _count++;
        System.out.println(employee.toString());
        return _count < _total;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值