迭代器模式

迭代器模式

定义:提供一种方法顺序的访问聚合对象(用来存储对象的容器可以是集合或者数组等)中的各个元素,但又不暴露其内部的表示。

迭代器模式里的几个角色:

●Iterator(抽象迭代器)访问元素的接口,定义了遍历元素的方法如:next()、hasNext()等。

●ConcreteIterator(具体迭代器)实现Iterator接口实现遍历聚合对象的方法。

●Aggregate(抽象聚合类)声明一个createIterator()方法用于返回Iterator的实现对象。

●ConcreteAggregate(具体聚合类)实现createIterator()方法用于返回对应的Iterator的实现对象。

实例讲解:

本次采用公司报表的比喻来进行讲解。假设A公司有两个子公司A-1和A-2每个子公司都有一个总经理来管理公司,这两位总经理每个月都必须将各自公司的财务报表提交给总公司的财务部经理然后由财务部经理将各子公司的财务情况向董事长汇报(这里的报表格式是一定的但是存储容器不一样)。

代码演示:

1.定义报表格式类

public class Item {
    //    消费名称
    private String name;
    //    消费金额
    private int price;
    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
        }
}

2.定义Iterator接口、

public interface Iterator {
    boolean hasNext();
    Item next();
}

3.这里假设A-1公司使用集合存储,A-2公司使用数组存储,那么接下来定义两子公司的Iterator具体实现类。

A-1

public class ChildOneIterator implements Iterator {
    private ArrayList<Item> datas;
    private int position=-1;
    public ChildOneIterator(ArrayList<Item> datas) {
        this.datas = datas;
    }

    @Override
    public boolean hasNext() {
        if(position+1>=datas.size()){
            return false;
        }
        return true;
    }

    @Override
    public Item next() {
        position++;
        if(hasNext()){
            return datas.get(position);
        }
        return null;
    }
}

A-2

public class ChildTwoIterator implements Iterator {
    private Item[] datas;
    private int position=-1;

    public ChildTwoIterator(Item[] datas) {
        this.datas = datas;
    }

    @Override
    public boolean hasNext() {
        if(position+1>=datas.length){
            return false;
        }
        return true;
    }

    @Override
    public Item next() {
        position++;
        if(hasNext()){
            return datas[position];
        }
        return null;
    }
}

4.定义Aggregate接口

public interface Aggregate {
    Iterator createIterator();
}

3.定义A-1公司报表格式类(A-1公司采用集合存储,A-2公司采用数组存储)

A-1

public class ChildOne implements Aggregate{
    private ArrayList<Item> datas;

    public ChildOne() {
        datas=new ArrayList<>();
        datas.add(new Item("吃饭",1000));
        datas.add(new Item("购买电脑",2000));
        datas.add(new Item("购买饮水机",600));
        datas.add(new Item("购买车票",500));
        datas.add(new Item("购买硬盘",6000));
    }

    @Override
    public Iterator createIterator() {
        return new ChildOneIterator(datas);
    }
}

A-2

public class ChildTwo implements Aggregate{
    private Item[] datas={};

    public ChildTwo() {
        datas[1]=new Item("买水",500);
        datas[2]=new Item("买花",200);
        datas[3]=new Item("买涂料",600);
        datas[4]=new Item("买办公桌",2000);
        datas[5]=new Item("买清洁工具",400);
    }

    @Override
    public Iterator createIterator() {
        return new ChildTwoIterator(datas);
    }
}

定义财务主管类(这里我是用Android实现的)

public class Treasurer extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ChildOne one=new ChildOne();
        ChildTwo two=new ChildTwo();
        print(one.createIterator());
        print(two.createIterator());
    }
    public void print(Iterator iterator){
        while (iterator.hasNext()){
            Item next = iterator.next();
            Log.e("测试",next.toString());
        }
    }
}

结果展示

迭代器模式
运行结果
上一篇:JQuery属性控制


下一篇:使用 SVG 制作单选和多选框动画【附源码】