zoukankan      html  css  js  c++  java
  • 设计模式 --迭代器模式(Iterator)

    能够游走于聚合内的每一个元素,同时还可以提供多种不同的遍历方式

     

    基本概念:

    就是提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示
     

    使用迭代器模式的优点:

    1. 遍历集合或者数组;
    2. 忽略集合和数组的结构;
    3. 提供不同的遍历方式;
    4. 符合单一职责原则。

    迭代器角色:

      1. 抽象迭代器:该接口必须定义实现迭代功能的最小定义方法集。
      2. 具体迭代器:迭代器接口Iterator的实现类。可以根据具体情况加以实现。
      3. 抽象聚合类:定义基本功能以及提供类似Iterator iterator()的方法。
      4. 具体聚合类:容器接口的实现类。必须实现Iterator iterator()方法。

    Book.java

    package com.soyoungboy.iterator2;
    public class Book {
        private String ISBN;
        private String name;
        private double price;
        
        public Book(String isbn, String name, double price) {
            ISBN = isbn;
            this.name = name;
            this.price = price;
        }
        public String getISBN() {
            return ISBN;
        }
        public void setISBN(String isbn) {
            ISBN = isbn;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        
        public void display() {
            System.out.println("ISBN=" + ISBN + ",name=" + name + ",price" + price);
        }
        
        
    }

    抽象迭代器Iterator.java

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

    具体迭代器Itr 具体聚合类BookList.java

    package com.soyoungboy.iterator2;
    import java.util.ArrayList;
    import java.util.List;
    public class BookList {
        private List<Book> bookList;
        private int index;
        public BookList() {
            bookList = new ArrayList<Book>();
        }
        
        //添加书籍
        public void addBook(Book book) {
            bookList.add(book);
        }
        
        //删除书籍
        public void deleteBook(Book book) {
            int bookIndex = bookList.indexOf(book);
            bookList.remove(bookIndex);
        }
            
        public Iterator Iterator() {
            return new Itr();
        }
        
        /**
         * 具体迭代器
         * @author soyoungboy
         *
         */
        private class Itr implements Iterator{
            public boolean hasNext() {
                if(index >= bookList.size()) {
                    return false;
                }
                return true;
            }
            public Object next() {
                return bookList.get(index++);
            }
            public void remove() {
                
            }
            
        }
        
    }

    测试代码类:MainClass.java

    package com.soyoungboy.iterator2;
    public class MainClss {
        public static void main(String[] args) {
            BookList bookList = new BookList();
            Book book1 = new Book("010203", "Java编程思想", 90);
            Book book2 = new Book("010204", "Java从入门到精通", 60);
            bookList.addBook(book1);
            bookList.addBook(book2);
            Iterator iter = bookList.Iterator();
            while (iter.hasNext()) {
                Book book = (Book) iter.next();
                book.display();
            }
        }
    }
    运行结果:
     
    ISBN=010203,name=Java编程思想,price90.0
    ISBN=010204,name=Java从入门到精通,price60.0  

    使用场景:

    java中数据集合遍历通常都会使用到迭代器设计模式进行数据的遍历过程;
    部分源码可参考:http://www.cnblogs.com/wjun530/archive/2007/06/11/778709.html这篇博文进行分析
    如通过Hashtable.elements方法可以得到一个Enumeration,然后通过这个Enumeration访问Hashtable中的数据,而不用关心Hashtable中的数据存放方式。
    如果有如下业务需求也可使用迭代器设计模式:
    访问容器中包含的内部对象 ;
    按顺序访问。
     
    参考文献资料:
    http://blog.sina.com.cn/s/blog_6e5e78bf0101owrq.html
  • 相关阅读:
    Android 如何自定义EditText 下划线?
    一步一步理解 Java 企业级应用的可扩展性
    客户案例—北京优络时代科技有限公司
    11个显著提升 ASP.NET 应用程序性能的技巧——第1部分
    如何用 React Native 创建一个iOS APP?(二)
    如何与 DevOps 为伍?
    通过 DevOps 整合开发和应用安全管道
    性能为王:选择模拟监控的10大理由!
    模拟监控和真实用户体验监测,选哪个?
    PHP 之 Laravel 框架安装及相关开源软件
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/4856016.html
Copyright © 2011-2022 走看看