首页 > 技术文章 > 迭代器模式

taoyong 2016-07-08 00:05 原文

迭代器模式定义:它提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

迭代器模式就是为解决遍历容器中的元素而诞生的。

举个栗子:我这有些水果,香蕉,荔枝,榴莲啊[流口水],一个手拿不下啊,于是就放在一个大篮子里,到家后,我又一个个拿出来了.[我好无聊噢]

代码清单-1 水果抽象类

/**
 * 水果抽象类
 */
public abstract class Fruits {
    //水果名称
    private String name = null;

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

    protected String getName() {
        return name;
    }

    //子类实现打印水果方法
    public abstract void printName();
}

代码清单-2 香蕉和荔枝

/**
 * 香蕉
 */
public class Banana extends Fruits {
    //价格
    private String  price = null;
    public Banana(String name,String price) {
        super(name);
        this.price = price;
    }

    @Override
    public void printName() {
        System.out.println(getName()+":"+price);
    }
}


/**
 * 荔枝
 */
public class Litchi extends Fruits{
    //价格
    private String price = null;
    public Litchi(String name, String price) {
        super(name);
        this.price = price;
    }

    @Override
    public void printName() {
        System.out.println(getName()+":"+price);
    }
}

代码清单-3 水果迭代器接口

/**
 * 水果迭代器
 */
public interface FruitsIterator<T>{

    //是否有下一个元素
    boolean hashNext();

    //返回下一个元素
    <T> T next();
}

代码清单-4 迭代器实现类

/**
 * 水果迭代器实现类
 * @param <T>
 */
public class FruitsIteratorImpl<T> implements FruitsIterator {
    private List<T> fruits = null;
    //容器内指向当前元素的游标
    private int currentItem = 0 ;

    public FruitsIteratorImpl(List<T> fruits) {
        this.fruits = fruits;
    }

    public boolean hashNext() {
        boolean rs = true;
        if(fruits == null || currentItem >= fruits.size() || fruits.get(currentItem) == null ){
            rs = false;
        }
        return rs;
    }

    public T next() {
        return fruits.get(currentItem++);
    }
}

代码清单-5 水果篮子 -容器类

/**
 * 水果篮子
 * @param <T>
 */
public class FruitsBasket<T>  {

    private List fruits = new ArrayList();

    //返回篮子的水果迭代器
    public FruitsIterator getFruitsIterator(){
        return new FruitsIteratorImpl(fruits);
    }

    //往篮子里放水果
    public <T> void add(T t){
        fruits.add(t);
    }
}

 代码清单-6 场景类

public class Client {
    public static void main(String[] args) {
        Fruits banana = new Banana("香蕉","0.8元/斤");
        Fruits litchi = new Litchi("荔枝","18元/斤");
        FruitsBasket<Fruits> basket = new FruitsBasket<Fruits>();
        basket.add(banana);
        basket.add(litchi);
        FruitsIterator<Fruits> fruitsIterator = basket.getFruitsIterator();
        //遍历
        while (fruitsIterator.hashNext()){
            Fruits fruits = fruitsIterator.next();
            fruits.printName();
        }
    }
}

执行结果

香蕉:0.8元/斤
荔枝:18元/斤

  

 

推荐阅读