zoukankan      html  css  js  c++  java
  • 迭代器设计模式

    Iterator 模式

    我们在学习数组的时候,想要拿到数组的内容,避免少用不了循环语句犹如下面的语句

    实际上拿到拿到每一个数据项的同时,就是依次访问数组中的元素,arr[0],arr[1]等

    UML(单纯实现一个放书过程)

    • 两个顶层接口 Aggregate 生成iterator Iterator 接口 用于具体的实例用到的方法
    • bookshelf 主要返回一个本省的一个迭代器实例
    • bookshelftiterator 是实现book过程iterator的主要接口
    • book 一个普通的书实体类

    主要code

    • book
    public class Book {
       private String name; 
       public Book(String name) {
          this.name=name;
       }
      
       public String getName() {
          return name;
       }
       @Override
       public String toString() {
          return "Book [name=" + name + "]";
       }
    }
    
    
    • Aggregate interface
    
     public interface Aggregate {
       public abstract Iterator iterator();
    }
    
    
    public interface Iterator {
        public abstract boolean hasNext();
        public abstract Object next();
    }
    
    • BookShelf
    public class BookShelf implements Aggregate{
       private Book [] books;
       private int last=0;//指针
       
       public BookShelf(int size) {
          this.books=new Book[size];
       }
        
       public Book getBook(int index) {
          return books[index];
       }
       
       public void appendBook(Book book) {
          this.books[last]=book;
          last++;//指针
       }
       public int getLength() {
          return last;
       }
    
       @Override
       public Iterator iterator() {
          return new BookShelfIterator(this);
       }
    }
    
    • BookShelfIterator
    public class BookShelfIterator implements Iterator {
        private BookShelf bookshelf;
        private int index;
        public BookShelfIterator(BookShelf bookShelf) {
            this.bookshelf = bookShelf;
            this.index = 0;
        }
        @Override
        public boolean hasNext() {
            if (this.index < bookshelf.getLength()) {
                return true;
            } else {
                return false;
            }
        }
        @Override
        public Object next() {
            Book book = bookshelf.getBook(index);//指针
            index++;
            return book;
        }
    
    }
    
    • 测试类 Main
    public class Main1 {
        public static void main(String[] args) {
            BookShelf bookShelf = new BookShelf(3);
            bookShelf.appendBook(new Book("a"));
            bookShelf.appendBook(new Book("b"));
            bookShelf.appendBook(new Book("c"));
            Iterator it = (Iterator) bookShelf.iterator();
            while(it.hasNext()) {
                System.out.println(it.next());
            }
        }
    }
    

    role 作用

    • iterator : 负责遍历元素的接口 ,hasnext()用于判断是否存在下一个 next() 用于取出下一个
    • concreteiterator : 具体的实现类,booksheftiterator 包含了由bookiterator返回的所有信息.
    • bookshelt :一个是作为数据的容器因为本省继承了aggregate接口,另一个是作为产生当前实例迭代器的一个总的实例对象.他们同时在内部需要维护一个指针.
    • concreteAggregate: 创建出具体的iterator对象,例子中由于booksheft扮演这个角色.
    • 总结表格
      | Aggregate | 集合接口 >>可用java本省提供的代替
      | Book | 普通实体类
      | BookShelf |代表书架
      | BookShelfIterator | 代表书架的迭代期
      | Iterator | 遍历接口>>也可以用本身的代替
      | Main1 | 测试类

    需要理解的重点知识

    1. 生成的iterator实例并不依赖与具体的迭代器实现,在我们维护的booksheftiterator 中只要能够保证booksheft返回的实例是正确的,那么程序就会执行下去.说简单点我们针对 Iterator进行有效的编程.
      2.维护的booksheft的Iteraotr 中next() 是指返回当前值,并且指向下一个值
      3.hasnext()是"最后一个"保证在while循环中能够正确的去执行.
      4.如果需要多个迭代期,在顶层接口集合中Aggregate增加即可
      5.如果你使用java编写那么不需要deleteiterator
    2. 例子中是使用的数组保存数据,我们可以使用java中已经维护好的数据结构进行操作
      7.可以使用java已经为我们提供好的一些接口实现

    相关模式

    • vistor 模式: 与迭代器最大的不同是对于每次拿到的数据要进行固定的处理
    • Factory Method模式: 生成实例过程中可能会用到的工厂模式
  • 相关阅读:
    堆的应用
    1155 Heap Paths (30 分)(堆+dfs遍历)
    1099 Build A Binary Search Tree (30 分)(查找二叉树)
    1064 Complete Binary Search Tree (30 分)(二叉查找树)
    1043 Is It a Binary Search Tree (25 分)(二叉查找树)
    1053 Path of Equal Weight (30 分)(树的遍历)
    1106 Lowest Price in Supply Chain (25 分)(树的遍历)
    洛谷P1031均分纸牌(贪心平均数)
    洛谷P1045麦森数(高精度乘法)
    洛谷P1255数楼梯(大数,高精度加法)
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8748004.html
Copyright © 2011-2022 走看看