28. 迭代器模式

定义

迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。

通俗理解

物流运输货物的时候,有不同的装箱方式也有不同的卸货方式,例如啤酒之类玻璃瓶装的要轻拿轻放、电子产品也是需要轻拿轻放的、建筑钢材之类都就随意了,可以乱扔。这个方式可不能搞混了,如果啤酒采用乱扔的方式,那么运输的就不是啤酒,而是一堆玻璃渣子;如果建筑钢材还轻拿轻放,那就太浪费人力物力。

面对这种情况,我们只能谨慎,不然这这一趟运输就白跑喽。可是要做到谨慎可不是那么容易的,因为不同的货物有不同的卸货方式,而不同的卸货方式需要不同的工具,那么我们在运输的时候就需要把相应的卸货工具给带上,况且,还需要有人会用这些卸货工具,如果一个人连叉车都没用过,那么怎么可以让他开呢?

于是,又陷进了一个,增加成本的困境。

解决这种困境的方式,有一个,就是成立专门的装卸货部门。由这个部门专业进行装卸货的工作,他们有专业的工具也有专业的人,物流公司只需要把货物给运到,剩下的工作就交个装卸货部门就可以了。他们会把货物妥妥当当地放到该放到的地方上去。

迭代器模式就是这样的一个理念。装卸货和运输分割开来,运输就只管运输,而装卸货也就只是装卸货。表现在程序上,就是对象在容器存储和对象的获取分割开来,在对象的获取方面,不管底层采用怎么样的存储方式,获取的方式都是采用统一接口,不关心底层的实现是如何。就是说,不管是怎么的货物,怎么摆放到车厢当中,只要交给卸货部门,就能很好卸货。

示例

业务采用装上面的实例。

渣渣程序

数组

public class Array {
    public String[] goods = new String[10];
}

程序入口

public class Main {
    public static void main(String[] args) {
        Array array = new Array();
        array.goods[0] = "第一个货物";
        array.goods[1] = "第二个货物";
        array.goods[2] = "第三个货物";

        System.out.println(array.goods[0]);
        System.out.println(array.goods[1]);
        System.out.println(array.goods[2]);
    }
}
//第一个货物
//第二个货物
//第三个货物

上面程序的问题显而易见了,就是我们必须知道对象在底层的实现方式,然后我们才能够根据他的实现方式去读取他里面的内容,这是一个数组的实现,我们采用数组的读取方式,那如果是链表的实现,那么我们也得采用链表的读取方式,太浪费精力。

优化

类图

程序

Array类不变。

迭代器接口与实现

public interface Iterator {
    String first();
    String next();
    boolean hasNext();
}
public class ConcreteIterator implements Iterator {
    private Array array;
    private int cursor;
    public ConcreteIterator(Array array) {
        cursor = 0;
        this.array = array;
    }
    public String first() {
        cursor = 0;
        return array.goods[cursor];
    }
    public String next() {
        String currentItem = array.goods[cursor];
        cursor ++;
        return currentItem;
    }
    public boolean hasNext() {
        if(array.goods[cursor] != null) {
            return true;
        }
        return false;
    }
}

程序入口

public class Main {
    public static void main(String[] args) {
        Array array = new Array();
        array.goods[0] = "第一个货物";
        array.goods[1] = "第二个货物";
        array.goods[2] = "第三个货物";

        Iterator iterator = new ConcreteIterator(array);
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
//第一个货物
//第二个货物
//第三个货物

优点

  1. 支持不同的迭代方法去访问一个容器对象;
  2. 简化聚合类,容器不需要提供遍历数据的方法,简化聚合类的设计;
  3. 存储和遍历分开,有利于解耦合。

缺点

  1. 存储和遍历分开,新加一个存储类就得增加一个迭代器的类,造成类的膨胀;
  2. 开发难度大,要考虑好扩展性。

应用场景

  1. 遍历容器内的对象,并不需要知道容器内部的数据结构;
  2. 允许对容器进行多级遍历;
  3. 提供一致的接口来遍历不同的实现方式的容器。

实例

JDK的java.util包,Java原生支持,foreach循环就是通过这个实现的。

程序

e28_iterator_pattern

吐槽

就是提供统一接口来访问一个容器对象而已。

https://www.jianshu.com/p/d70e15d140a5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容