资讯专栏INFORMATION COLUMN

设计模式(12)迭代器模式(讲解+应用)

宋华 / 1098人阅读

摘要:目录迭代器模式为什么要用迭代器模式迭代器模式应用实例迭代器模式不知不觉更了篇,从今天开始近乎每天全满的课程开始了,更新速度也要受到影响。

目录

迭代器模式

为什么要用迭代器模式

迭代器模式应用实例

迭代器模式

不知不觉更了12篇,从今天开始近乎每天全满的课程开始了,更新速度也要受到影响。

迭代器,最早听到这个概念的时候是在大一的时候还对java一知半解就去搞Android的时候,接触到的,在用到对于数据库的操作的时候,我们来获得数据的时候通过 rawQuery执行sql语句来获得数据集返回的就是一个游标实例,Cursor,因此迭代器模式也被称作是游标模式,具体例子和其使用在后面实例部分介绍。

迭代器:提供一种方法来遍历集合的同时,又不暴露该集合的底层数据存储的实现。

为什么要使用迭代器模式

我们常见的集合有很多种类,其顶层数据存储和组织方式的不同导致了我们在对数据进行遍历的时候存在一些差异,迭代器模式就是通过实现某种统一的方式来实现对不同的集合的遍历,同时又不暴露出其底层的数据存储和组织方式。

继续我们造机器的问题,在讲适配器的时候提到了,我们拥有不止一个商店,而且每个商店里所出售的货物的种类也是不同的,惧于马云大大的“不做电子商务将无商可务”,决定不仅仅是通过线下的这种销售,在网上也进行出售,网上的店将作为一个集合,集合线下店里所有的产品,当有客户下单,就有具有该上商品的网店进行发货,那么第一个要解决的问题就是我要知道这些商店里都有什么产品,所以需要他们给提供一个货物的种类单,由于不同的商店,其对商品种类管理使用的数据结构也是不相同的,有的是通过一个数组来存放,因为他们的店里永远只会卖固定种类的货物,然后有一些店里在不停的扩展规模,因此会通过一个可扩展的ArrayList来存放。(当然,现实中不会如此,为了举例方便)然后,现在各个商家给我数据了,而且不止这两种,这个时候头大了。

开始,这样来实现

public class Store{

//用来持有所有菜单条目
    public ArrayListlist = new ArrayList();

    public Store(){

    }
//针对不同的商店创建不同的类型
    public void getFirstStoreMachines(FirstStoreMenu menu){
        MenuItem [] firstStoreMenu = menu.getMenuItems();
        for(int i=0; i secondStoreMenu = menu.getMenuItems();
        for(int i=0; i

针对每一个商店的数据集进行遍历,来获得菜单条目,如果有一百个商店,那么我们的代码量将变得很大,同时后期的维护也变得很困难了。

这个时候,又到了设计模式大显身手的时候了。通过迭代器模式来给数组和容器包上一层,使得其内部结构对外完全不可见,从而使得我们无需针对每种数据结构多带带进行遍历操作。代码实例如下。
根据设计模式的基本原则针对接口编程,而不要针对具体类型,so

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

看到这两个方法,获取sqlite数据库中的数据的既视感。
然后之前我们的商店菜单类是这样实现的

public class FirstStoreMenu extends Menu{
    MenuItem[] items;

    public MenuItem[] getFirstStoreMachines{
        return items;
    }
}

现在我们要使用迭代器了,所有要返回一个迭代器了,返回什么样的迭代器,这个迭代器具体要怎么实现呢?

public class FirstMenuIterator implements Iterator{
    MenuItem[] items;
    int position=0;

    public FirstMenuIterator(MenuItem[] items){
        this.items = items;
    }
//向下移动
    public Object next(){
        MenuItem menuItem  = items[position];
        position++;
        return menuItem;
    } 
//判断
    public boolean hasNext(){
        if(position>=items.length||items[position]==null){
            return false;
        }else{
            return true;
        }
    }
}
//通过判断和移动的结合实现我们需要的遍历操作

有了针对我们商店菜单的迭代器了,那么接下来可以这样写了

public class FirstStoreMenu extends Menu{
    MenuItem[]items;

    public Iterator createIterator(){
        return new FirstMenuIterator(items);
    }
}

我们总店中要如何应用这个迭代器呢?

public class Store{

//用来持有所有菜单条目
    public ArrayListlist = new ArrayList();

    public Store(){

    }

    public void addItem(Iterator iterator){
        while(iterator.hasNext())
            list.add(iterator.next());
    }

//用来展示所有的商品种类
    public void display(){
        for(int i=0; i

通过这种方式,我们不仅使得代码变得简洁(Store内的代码),同时也使得我们的编程针对接口再进行编程。使得store类对各商店菜单类的耦合变低。这样我们通过addItem方法向Store实例注入依赖实例即可完成对于各个商店的商品的汇总。

应用实例

上面提到了Android的数据库sqlite获得数据的时候,当然对于数据集的操作迭代器是很常用的。
Android中叫它游标,这个称呼更好的反应出了特性,在数据集之上游走。具体代码此处不再贴出。

边城大神,在文章中提到了一个桥接模式,对于这个模式,桥接模式其思想为,将对象和行为多带带封装成类,对象的特征和行为松耦合,然后对象自身并不去实现行为,通过对委托的形式调用行为类,结构上比较像是策略模式的结构。

下篇更新生成器模式,结合Android中的AlertDialog.Builder来谈下

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12402.html

相关文章

  • 设计模式12迭代模式讲解+应用

    摘要:目录迭代器模式为什么要用迭代器模式迭代器模式应用实例迭代器模式不知不觉更了篇,从今天开始近乎每天全满的课程开始了,更新速度也要受到影响。 目录 迭代器模式 为什么要用迭代器模式 迭代器模式应用实例 迭代器模式 不知不觉更了12篇,从今天开始近乎每天全满的课程开始了,更新速度也要受到影响。 迭代器,最早听到这个概念的时候是在大一的时候还对java一知半解就去搞Android的时候,接...

    golden_hamster 评论0 收藏0
  • 从观察者模式迭代模式系统讲解 RxJS Observable(一)

    摘要:是的缩写,起源于,是一个基于可观测数据流结合观察者模式和迭代器模式的一种异步编程的应用库。是基于观察者模式和迭代器模式以函数式编程思维来实现的。学习之前我们需要先了解观察者模式和迭代器模式,还要对流的概念有所认识。 RxJS 是 Reactive Extensions for JavaScript 的缩写,起源于 Reactive Extensions,是一个基于可观测数据流 Stre...

    notebin 评论0 收藏0
  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0
  • 《JavaScript 模式》知识点小抄本(上)

    摘要:单体模式有以下优点用来划分命名空间,减少全局变量数量。通常我们使用操作符创建单体模式的三种选择,让构造函数总返回最初的对象使用全局对象来存储该实例不推荐,容易全局污染。实现该工厂模式并不困难,主要是要找到能够穿件所需类型对象的构造函数。 介绍 最近开始给自己每周订个学习任务,学习结果反馈为一篇文章的输出,做好学习记录。 这一周(02.25-03.03)我定的目标是《JavaScri...

    didikee 评论0 收藏0
  • 进阶Java架构师必看的15本书

    摘要:阿里巴巴的共享服务理念以及企业级互联网架构建设的思路,给这些企业带来了不少新的思路,这也是我最终决定写这本书的最主要原因。尽在双阿里巴巴技术演进与超越是迄今唯一由阿里巴巴集团官方出品全面阐述双八年以来在技术和商业上演进和创新历程的书籍。 showImg(https://segmentfault.com/img/remote/1460000015386860); 1、大型网站技术架构:核...

    Julylovin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<