美文网首页Android高级技术Android开发经验谈Android技术知识
Android 架构师之路16 设计模式之迭代器模式

Android 架构师之路16 设计模式之迭代器模式

作者: 香沙小熊 | 来源:发表于2018-02-01 16:44 被阅读119次

    Android 架构师之路 目录

    1、迭代器模式概念

    1.1 介绍

    迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一。
    源于对容器的访问,比如java中的list,Map,数组等,我们知道对容器对象的访问必然是多种多样的,所以我们把遍历的方法封装在容器中,或者不提供遍历方法。

    1.2 定义

    提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。

    1.3 使用场景
    • 访问一个聚合对象的内容而无需暴露它的内部表示

    • 支持对聚合对象的多种遍历

    • 为遍历不同的聚合结构提供一个统一的接口

    2、迭代器模式UML类图

    迭代器模式UML类图

    角色如下:

    • Iterator(迭代器):迭代器定义访问和遍历元素的接口

    • ConcreteIterator (具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置

    • Aggregate (聚合):聚合定义创建相应迭代器对象的接口

    • ConcreteAggregate (具体聚合):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例

    3、迭代器模式实现

    Iterator:
    /**
    *抽象迭代接口
    */
    public interface Iterator <T>{
    
        /**
         * 是否有下一元素
         * @return
         */
        boolean hasNext();
    
        T next();
    }
    
    ConcreteItertor:
    /**
     * 具体的迭代角色
     */
    public class ConcreteItertor<T> implements Iterator<T>{
        public ConcreteItertor(List<T> list) {
            this.list = list;
        }
        private List<T> list = new ArrayList<>();
        private int cursor = 0;
        @Override
        public boolean hasNext() {
            return cursor!=list.size();
        }
    
        @Override
        public T next() {
            T obj = null;
            if(this.hasNext()){
                obj = list.get(cursor++);
            }
            return obj;
        }
    }
    
    Aggregate:
    /**
     * 容器的接口
     */
    public interface Aggregate<T> {
        void add(T t);
    
        void remove(T t);
    
        Iterator<T> iterator();
    }
    
    
    ConcreteAggregate:
    public class ConcreteAggregate<T> implements Aggregate<T> {
    
        private List<T> list = new ArrayList<>();
        @Override
        public void add(T t) {
          list.add(t);
        }
    
        @Override
        public void remove(T t) {
            list.remove(t);
        }
    
        @Override
        public Iterator<T> iterator() {
            return new ConcreteItertor<>(list);
        }
    }
    
    Client:
    public class Client {
        public static void main(String[] args){
            //实例化容器类对象
            Aggregate<String> aggregate = new ConcreteAggregate<>();
            aggregate.add("aaaa");
            aggregate.add("bbbb");
            aggregate.add("cccc");
            Iterator<String> iterator = aggregate.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    }
    
    

    结果输出:

    aaaa
    bbbb
    cccc
    

    4、Android源码中的模式实现

    1.除了各种数据结构体,如List,Map等包含的迭代器外
    2.Android自身源码中也为我们提供了迭代器遍历数据,最为典型的例子就是数据库查询使用Cursor(当我们使用SQLiteDatabase的query方法查询数据库时返回的),该游标对象实质就是一个具体的迭代器,我们可以使用它来遍历数据库查询所得的结果集

    5、模式总结

    5.1 优点
    • 它支持以不同的方式遍历一个聚合对象。
    • 迭代器简化了聚合类。
    • 在同一个聚合上可以有多个遍历。
    • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
    5.2 缺点
    • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

    相关文章

      网友评论

        本文标题:Android 架构师之路16 设计模式之迭代器模式

        本文链接:https://www.haomeiwen.com/subject/ikmdzxtx.html