• 集合遍历[设计模式总结] 9. 迭代器模式


    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家起一学习一下集合遍历

        

    引子

        例如Waitress类要遍历打印两种菜单,一种是基于ArrayList,一种是基于数组;

        则Waitress要需对他们分别用两个不同的逻辑来遍历。

        

        

    义定

        Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

        迭代器模式供提了一种法方次序拜访一个聚合象对中的各个素元,而又不暴露该象对的部内表现。

        

        

    类图

        

        

    Iterator:抽象迭代器

        这是有所迭代器都必须实现的接口,利用该接口法方可以在集合素元之间游走。可用java.util.Iterator

        

    ConcreteIterator:详细迭代器

        详细迭代器责负理管前目遍历的置位、成完集合素元的遍历。

    public class DinerMenuIterator implements Iterator {
        MenuItem[] list;
        int position = 0; //记载前当遍历置位
        
        public DinerMenuIterator(MenuItem[] list){
            this.list = list
        }
    
        public Object next(){
            MenuItem menuItem = list[position];
            position = position + 1;
            return menuItem;  
        }
    
        public boolean hasNext(){
            if (position >= list.length || list[position] == null){
                return false;
            } else {
                return true;
            }
        }
    }

        

    Aggregate:抽象聚合(集合)

        每日一道理
    人生是洁白的画纸,我们个每人就是手握各色笔的画师;人生也是一条看不到尽头的长路,我们个每人则是人生道路的远足者;人生还像是一块神奇的土地,我们个每人则是手握农具的耕耘者;但人生更像一本难懂的书,我们个每人则是孜孜不倦的读书郎。

        是对详细集合类的抽象,便利户客端代码,将户客端代码从详细集合象对中解耦——让户客端:针对接口程编,而不针对实现程编

        

    ConcreteAggregate:详细聚合(集合)

        实现createIterator(),返回一个ConcreteIterator象对;该迭代器象对够能遍历象对集合。

    public class DinerMenu {
        MenuItem[] menuItems;
        //返回迭代器接口
        public Iterator createIterator {
            return new DinerMenuIterator( menuItems );
        }
        //这个法方不再要需,因为会暴露部内实现!!
        public MenuItem[] getMenuItem(){
            return menuItems;
        }
    }

        

    长处

        

    1. 让户客遍历你的象对,而又没法窥视你存储象对的方法
    2. Iterator封装“遍历集合内个每象对的程过”;——将遍历的任务放在迭代器上,而不是集合上;简化了集合的接口和实现,也让义务各得其所(单一职责准则 > 高内聚)
    3. 每种ConcreteAggregate集合的部内实现可能不同,但遍历法方都统起一来了,便利户客端代码。——户客端代码与集合实现类解耦。

        

        

    缺陷

        

        

    应用场景

        尽量不要自己写迭代器模式。应用Java供提的Iterator一般就足够了。

        

        注:上例中是数组,所以自己写了个Iterator;如果是ArrayList则直接应用.iterator()可即!

        

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: 那是习惯决定的,一直保持一个习惯是不好的!IE6的用户不习惯多标签,但是最终肯定还是得转到多标签的浏览器。历史(软件UI)的进步(改善)不是以个人意志(习惯)为转移的!

  • 相关阅读:
    夺命雷公狗----仿淘宝的菜单功能
    夺命雷公狗---在js里阻止a标签的跳转和form表单的跳转
    夺命雷公狗mongodb之----mongodb---1---的下载,安装,连接
    夺命雷公狗ThinkPHP项目之----企业网站30之网站前台头部导航的高亮显示
    夺命雷公狗ThinkPHP项目之----企业网站29之网站前台左侧导航的高亮显示
    夺命雷公狗ThinkPHP项目之----企业网站28之网站前台左侧导航的实现
    夺命雷公狗ThinkPHP项目之----企业网站27之网站前台单页的完成(从百度编辑器里面取出文章数据)
    夺命雷公狗ThinkPHP项目之----企业网站26之网站前台列表页的显示和完成分页功能
    夺命雷公狗ThinkPHP项目之----企业网站25之网站前台面包屑导航URL的完善
    夺命雷公狗ThinkPHP项目之----企业网站24之网站前台获取当前栏目和顶级栏目
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3034392.html
Copyright © 2020-2023  润新知