迭代器模式

简介: 迭代器模式定义:提供一种方法顺序的访问聚合对象(用来存储对象的容器可以是集合或者数组等)中的各个元素,但又不暴露其内部的表示。迭代器模式里的几个角色:●Iterator(抽象迭代器)访问元素的接口,定义了遍历元素的方法如:next()、hasNext()等。

迭代器模式

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

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

●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());
        }
    }
}

结果展示

img_30b459945bb53064b6e1d788ab99a18a.png
运行结果
目录
相关文章
|
3月前
|
设计模式 Java 数据挖掘
聊聊Java设计模式-迭代器模式
迭代器(Iterator)模式,也叫做游标(Cursor)模式。我们知道,在Java 容器中,为了提高容器遍历的方便性,我们利用迭代器把遍历逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合容器的内部结构。
43 0
聊聊Java设计模式-迭代器模式
|
4月前
|
设计模式 uml C++
行为型 迭代器模式
行为型 迭代器模式
20 0
|
6月前
|
设计模式 存储 算法
设计模式~迭代器模式(Iterator)-20
迭代器模式(Iterator Pattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。迭代器模式已经被淘汰,java中已经把迭代器运用到各个聚集类(collection)中了,使用java自带的迭代器就已经满足我们的需求了 目录 迭代器模式(Iterator) (1)优点 (2)缺点 (3)使用场景 (4)注意事项 (5)应用实例: 代码
25 0
|
9月前
|
设计模式 存储 Java
迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象中每个元素的方法,而不暴露其内部实现。
57 1
|
10月前
|
容器
关于迭代器模式我所知道的
关于迭代器模式我所知道的
40 0
|
11月前
|
设计模式 Java 索引
Java设计模式-迭代器模式(Iterator)
Java设计模式-迭代器模式(Iterator)
|
JavaScript 前端开发
简单理解迭代器模式
这几天研究了一下迭代器模式,期间有一段时间经常搞不太懂一些概念与概念之间的关系,今天来整理一下。
101 0
|
设计模式 算法 Java
Java设计模式 ->迭代器模式
Java设计模式 ->迭代器模式
64 0
|
设计模式 存储 容器
我学会了,迭代器模式
迭代器模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
83 0
我学会了,迭代器模式
|
Java 容器
迭代器模式
迭代器模式
82 0