zoukankan      html  css  js  c++  java
  • 迭代器模式以及对内部类的运用

     正文前先来一波福利推荐:

     福利一:

    百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。

    福利二:

    毕业答辩以及工作上各种答辩,平时积累了不少精品PPT,现在共享给大家,大大小小加起来有几千套,总有适合你的一款,很多是网上是下载不到。

    获取方式:

    微信关注 精品3分钟 ,id为 jingpin3mins,关注后回复   百万年薪架构师 ,精品收藏PPT  获取云盘链接,谢谢大家支持!

    -----------------------正文开始---------------------------

    一、

    上一篇文章写了static的作用,其中有部分是介绍了内部类和静态内部类,下面就结合设计模式中的迭代器模式,介绍一下内部类的好处;

    1.首先将内部类的作用说一下:

    一、内部类可以直接访问外部类的东西,如果没有内部类,要实现迭代器模式,有2种方式,第一,在容器类中定义一些方法,那就需要定义一些全局成员变量来记录光标等等一些数据,导致容器类繁杂,不易扩展。第二,与容器类平级建立一个迭代器类,这就需要类与类之间的通信,提升了容器类与迭代器类之间的耦合度。

      而,内部类,可以直接访问到容器类的成员变量与成员函数,内部类只需实现自己的方法即可。

      还有一个好处就是借鉴一位网友评论所讲的,比如ArrayList的内部类 ArrayIterator被其它类重复使用到的机会很少,这才导致他们将它设计成内部类,如果会被其它类大量重用,设计成内部类就不太好了,即使它有那么多“优点”。HashMap的内部类Entry就是典型的出于这个原因设计的,首先是它想要用外部类Entry都不行,已经存在同名的类了,而恰巧HashMap的Entry也基本只有HashMap自己会用,那就正好设计成内部类了。

    2.迭代器模式的好处:

    • 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
    • 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
    • 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
    • 当增加其他的集合类型时候,直接实现对应接口,内部类直接实现Iterator接口,实现其所有相关方法,完全符合开闭原则(本人自己想的);

    二、UML图

    下面的代码是Java集合框架内部实现迭代器模式的精简版:

    public interface Iterator<E> {//迭代器接口精简版
        boolean hasNext();
        E next();
    }
    public interface List<E> {//容器接口精简版
        Iterator<E> iterator();
    }
    复制代码
    public class ArrayList<E> implements List<E> {
        private Object[] array;
        
        public ArrayList(){
            this.array=new Object[5];
            this.array[0]="a";
            this.array[1]="b";
            this.array[2]="c";
            this.array[3]="d";
            this.array[4]="e";
        }
        public Iterator<E> iterator() {
            return new ArrayIterator();
        }
        public class ArrayIterator implements Iterator<E>{ //内部类中实现了其他类接口,减少了耦合性  必须要实现Iterator要具备的方法
            private int cursor=0;
            public boolean hasNext() {
                if(cursor<array.length){ //可以直接访问外部类的Object数组
                    return true;
                }
                return false;
            }
            @SuppressWarnings("unchecked")
            public E next() {
                E e=(E) array[cursor++];            
                return e; //直接返回外部类对应的数据
            }
        }
    }
  • 相关阅读:
    蓝桥杯 2014本科C++ B组 六角填数 枚举排列
    蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索
    埃及分数 IDA*
    优先队列详解(转载)
    HDU 1242 Rescue BFS+优先队列
    HDU 1627 Krypton Factor
    2018中国机器人大赛服务机器人专项赛赛后总结
    OpenMP使用体验报告(概述)
    写在归程路上——2018ROBOCUP机器人世界杯中国赛
    ROS编译工作区缺少cv_bridge的问题解决
  • 原文地址:https://www.cnblogs.com/gxyandwmm/p/9484079.html
Copyright © 2011-2022 走看看